diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#Controller.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#Controller.dbg.json
index e872235..7d8a2a7 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#Controller.dbg.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#Controller.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/27822028aefba6db9743fbac66c2677f7feca3ad.json"
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#Controller.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#Controller.json
index 91966d3..c57832d 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#Controller.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#Controller.json
@@ -382,11 +382,11 @@
"type": "function"
}
],
- "bytecode": "0x608060405234801561000f575f5ffd5b50604051610e6c380380610e6c83398101604081905261002e91610444565b856001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610172565b505f5b85518110156100a35761009b8682815181106100865761008661051f565b602002602001015160016101c160201b60201c565b600101610068565b505f5b84518110156100e1576100d98582815181106100c4576100c461051f565b6020026020010151600161022060201b60201c565b6001016100a6565b505f5b835181101561011f576101178482815181106101025761010261051f565b6020026020010151600161027760201b60201c565b6001016100e4565b505f5b825181101561015d576101558382815181106101405761014061051f565b602002602001015160016102ce60201b60201c565b600101610122565b5061016781610325565b505050505050610533565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f81815260016020908152604091829020805460ff191685151590811790915591519182527f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f15091015b60405180910390a25050565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d99249101610214565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c39101610214565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c9101610214565b6005805460ff191660ff83169081179091556040517f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b0358905f90a250565b80516001600160a01b0381168114610378575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126103a0575f5ffd5b81516001600160401b038111156103b9576103b961037d565b604051600582901b90603f8201601f191681016001600160401b03811182821017156103e7576103e761037d565b604052918252602081850181019290810186841115610404575f5ffd5b6020860192505b8383101561042a5761041c83610362565b81526020928301920161040b565b5095945050505050565b805160ff81168114610378575f5ffd5b5f5f5f5f5f5f60c08789031215610459575f5ffd5b61046287610362565b60208801519096506001600160401b0381111561047d575f5ffd5b61048989828a01610391565b604089015190965090506001600160401b038111156104a6575f5ffd5b6104b289828a01610391565b606089015190955090506001600160401b038111156104cf575f5ffd5b6104db89828a01610391565b608089015190945090506001600160401b038111156104f8575f5ffd5b61050489828a01610391565b92505061051360a08801610434565b90509295509295509295565b634e487b7160e01b5f52603260045260245ffd5b61092c806105405f395ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c80637d701102116100885780638da5cb5b116100635780638da5cb5b146101ce5780638f72c136146101e8578063d9d8edb9146101fb578063f2fde38b1461021d575f5ffd5b80637d701102146101865780637e8d9637146101a857806384aaa224146101bb575f5ffd5b806361655670116100b8578063616556701461013d578063680038c71461015f578063715018a61461017e575f5ffd5b8063090de7df146100de578063163eed9e146100f35780633d41132f1461012a575b5f5ffd5b6100f16100ec3660046107df565b610230565b005b6101156101013660046108a2565b60036020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100f16101383660046107df565b6102ae565b61011561014b3660046108a2565b60046020525f908152604090205460ff1681565b60055461016c9060ff1681565b60405160ff9091168152602001610121565b6100f1610327565b6101156101943660046108a2565b60026020525f908152604090205460ff1681565b6100f16101b63660046108c2565b61033a565b6100f16101c93660046107df565b61034e565b5f546040516001600160a01b039091168152602001610121565b6100f16101f63660046107df565b6103c7565b6101156102093660046108a2565b60016020525f908152604090205460ff1681565b6100f161022b3660046108a2565b610440565b610238610498565b805182511461025a57604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a9576102a183828151811061027a5761027a6108e2565b6020026020010151838381518110610294576102946108e2565b60200260200101516104dd565b60010161025c565b505050565b6102b6610498565b80518251146102d857604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a95761031f8382815181106102f8576102f86108e2565b6020026020010151838381518110610312576103126108e2565b602002602001015161053c565b6001016102da565b61032f610498565b6103385f610593565b565b610342610498565b61034b816105fa565b50565b610356610498565b805182511461037857604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a9576103bf838281518110610398576103986108e2565b60200260200101518383815181106103b2576103b26108e2565b6020026020010151610637565b60010161037a565b6103cf610498565b80518251146103f157604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a957610438838281518110610411576104116108e2565b602002602001015183838151811061042b5761042b6108e2565b602002602001015161068e565b6001016103f3565b610448610498565b6001600160a01b03811661048f576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b61034b81610593565b5f546001600160a01b03163314610338576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610486565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c391015b60405180910390a25050565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d99249101610530565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6005805460ff191660ff83169081179091556040517f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b0358905f90a250565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c9101610530565b6001600160a01b0382165f81815260016020908152604091829020805460ff191685151590811790915591519182527f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f1509101610530565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610722576107226106e5565b604052919050565b5f67ffffffffffffffff821115610743576107436106e5565b5060051b60200190565b80356001600160a01b0381168114610763575f5ffd5b919050565b5f82601f830112610777575f5ffd5b813561078a6107858261072a565b6106f9565b8082825260208201915060208360051b8601019250858311156107ab575f5ffd5b602085015b838110156107d557803580151581146107c7575f5ffd5b8352602092830192016107b0565b5095945050505050565b5f5f604083850312156107f0575f5ffd5b823567ffffffffffffffff811115610806575f5ffd5b8301601f81018513610816575f5ffd5b80356108246107858261072a565b8082825260208201915060208360051b850101925087831115610845575f5ffd5b6020840193505b8284101561086e5761085d8461074d565b82526020938401939091019061084c565b9450505050602083013567ffffffffffffffff81111561088c575f5ffd5b61089885828601610768565b9150509250929050565b5f602082840312156108b2575f5ffd5b6108bb8261074d565b9392505050565b5f602082840312156108d2575f5ffd5b813560ff811681146108bb575f5ffd5b634e487b7160e01b5f52603260045260245ffdfea26469706673582212204e1a03491d67aedff2296b499cf5fee36529062002d67b286fb08859eac0e13664736f6c634300081c0033",
- "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106100da575f3560e01c80637d701102116100885780638da5cb5b116100635780638da5cb5b146101ce5780638f72c136146101e8578063d9d8edb9146101fb578063f2fde38b1461021d575f5ffd5b80637d701102146101865780637e8d9637146101a857806384aaa224146101bb575f5ffd5b806361655670116100b8578063616556701461013d578063680038c71461015f578063715018a61461017e575f5ffd5b8063090de7df146100de578063163eed9e146100f35780633d41132f1461012a575b5f5ffd5b6100f16100ec3660046107df565b610230565b005b6101156101013660046108a2565b60036020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100f16101383660046107df565b6102ae565b61011561014b3660046108a2565b60046020525f908152604090205460ff1681565b60055461016c9060ff1681565b60405160ff9091168152602001610121565b6100f1610327565b6101156101943660046108a2565b60026020525f908152604090205460ff1681565b6100f16101b63660046108c2565b61033a565b6100f16101c93660046107df565b61034e565b5f546040516001600160a01b039091168152602001610121565b6100f16101f63660046107df565b6103c7565b6101156102093660046108a2565b60016020525f908152604090205460ff1681565b6100f161022b3660046108a2565b610440565b610238610498565b805182511461025a57604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a9576102a183828151811061027a5761027a6108e2565b6020026020010151838381518110610294576102946108e2565b60200260200101516104dd565b60010161025c565b505050565b6102b6610498565b80518251146102d857604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a95761031f8382815181106102f8576102f86108e2565b6020026020010151838381518110610312576103126108e2565b602002602001015161053c565b6001016102da565b61032f610498565b6103385f610593565b565b610342610498565b61034b816105fa565b50565b610356610498565b805182511461037857604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a9576103bf838281518110610398576103986108e2565b60200260200101518383815181106103b2576103b26108e2565b6020026020010151610637565b60010161037a565b6103cf610498565b80518251146103f157604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a957610438838281518110610411576104116108e2565b602002602001015183838151811061042b5761042b6108e2565b602002602001015161068e565b6001016103f3565b610448610498565b6001600160a01b03811661048f576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b61034b81610593565b5f546001600160a01b03163314610338576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610486565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c391015b60405180910390a25050565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d99249101610530565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6005805460ff191660ff83169081179091556040517f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b0358905f90a250565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c9101610530565b6001600160a01b0382165f81815260016020908152604091829020805460ff191685151590811790915591519182527f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f1509101610530565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610722576107226106e5565b604052919050565b5f67ffffffffffffffff821115610743576107436106e5565b5060051b60200190565b80356001600160a01b0381168114610763575f5ffd5b919050565b5f82601f830112610777575f5ffd5b813561078a6107858261072a565b6106f9565b8082825260208201915060208360051b8601019250858311156107ab575f5ffd5b602085015b838110156107d557803580151581146107c7575f5ffd5b8352602092830192016107b0565b5095945050505050565b5f5f604083850312156107f0575f5ffd5b823567ffffffffffffffff811115610806575f5ffd5b8301601f81018513610816575f5ffd5b80356108246107858261072a565b8082825260208201915060208360051b850101925087831115610845575f5ffd5b6020840193505b8284101561086e5761085d8461074d565b82526020938401939091019061084c565b9450505050602083013567ffffffffffffffff81111561088c575f5ffd5b61089885828601610768565b9150509250929050565b5f602082840312156108b2575f5ffd5b6108bb8261074d565b9392505050565b5f602082840312156108d2575f5ffd5b813560ff811681146108bb575f5ffd5b634e487b7160e01b5f52603260045260245ffdfea26469706673582212204e1a03491d67aedff2296b499cf5fee36529062002d67b286fb08859eac0e13664736f6c634300081c0033",
+ "bytecode": "0x60806040523461031257610be38038038061001981610316565b92833981019060c081830312610312576100328161034f565b60208201519092906001600160401b0381116103125781610054918401610363565b60408301519091906001600160401b0381116103125781610076918501610363565b60608401516001600160401b0381116103125782610095918601610363565b60808501519092906001600160401b0381116103125760a0916100b9918701610363565b9401519460ff8616809603610312576001600160a01b031680156102ff575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a35f5b835181101561017e576001906001600160a01b0361013782876103cd565b5116805f528260205260405f208360ff198254161790557f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f1506020604051858152a201610119565b509150915f5b82518110156101ea576001906001600160a01b036101a282866103cd565b5116805f52600260205260405f208360ff198254161790557f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d99246020604051858152a201610184565b8482855f5b8151811015610255576001906001600160a01b0361020d82856103cd565b5116805f52600360205260405f208360ff198254161790557ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c36020604051858152a2016101ef565b50505f5b81518110156102bf576001906001600160a01b0361027782856103cd565b5116805f52600460205260405f208360ff198254161790557fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c6020604051858152a201610259565b6005805460ff191684179055604051837f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b03585f80a26107ed90816103f68239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761033b57604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361031257565b9080601f83011215610312578151916001600160401b03831161033b578260051b90602080610393818501610316565b80968152019282010192831161031257602001905b8282106103b55750505090565b602080916103c28461034f565b8152019101906103a8565b80518210156103e15760209160051b010190565b634e487b7160e01b5f52603260045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063090de7df1461054e578063163eed9e146105115780633d41132f146104735780636165567014610436578063680038c714610416578063715018a6146103b25780637d701102146103755780637e8d96371461031c57806384aaa2241461027e5780638da5cb5b146102595780638f72c13614610192578063d9d8edb9146101555763f2fde38b146100a8575f80fd5b34610151576020366003190112610151576001600160a01b036100c961063e565b6100d1610778565b168015610125576001600160a01b035f548273ffffffffffffffffffffffffffffffffffffffff198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5f80fd5b34610151576020366003190112610151576001600160a01b0361017661063e565b165f526001602052602060ff60405f2054166040519015158152f35b34610151576101a036610654565b6101a8610778565b8151815103610231575f5b825181101561022f57806001600160a01b036101d160019386610750565b51167f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f15060206102008487610750565b511515835f528582526102228160405f209060ff801983541691151516179055565b604051908152a2016101b3565b005b7feb175734000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610151575f3660031901126101515760206001600160a01b035f5416604051908152f35b346101515761028c36610654565b610294610778565b8151815103610231575f5b825181101561022f57806001600160a01b036102bd60019386610750565b51167fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c60206102ec8487610750565b511515835f526004825261030f8160405f209060ff801983541691151516179055565b604051908152a20161029f565b346101515760203660031901126101515760043560ff811680910361015157610343610778565b8060ff1960055416176005557f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b03585f80a2005b34610151576020366003190112610151576001600160a01b0361039661063e565b165f526002602052602060ff60405f2054166040519015158152f35b34610151575f366003190112610151576103ca610778565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610151575f36600319011261015157602060ff60055416604051908152f35b34610151576020366003190112610151576001600160a01b0361045761063e565b165f526004602052602060ff60405f2054166040519015158152f35b346101515761048136610654565b610489610778565b8151815103610231575f5b825181101561022f57806001600160a01b036104b260019386610750565b51167f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d992460206104e18487610750565b511515835f52600282526105048160405f209060ff801983541691151516179055565b604051908152a201610494565b34610151576020366003190112610151576001600160a01b0361053261063e565b165f526003602052602060ff60405f2054166040519015158152f35b346101515761055c36610654565b610564610778565b8151815103610231575f5b825181101561022f57806001600160a01b0361058d60019386610750565b51167ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c360206105bc8487610750565b511515835f52600382526105df8160405f209060ff801983541691151516179055565b604051908152a20161056f565b6040519190601f01601f1916820167ffffffffffffffff81118382101761061257604052565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff81116106125760051b60200190565b600435906001600160a01b038216820361015157565b9060406003198301126101515760043567ffffffffffffffff8111610151578260238201121561015157806004013561069461068f82610626565b6105ec565b916024602084848152019260051b8201019085821161015157602401915b81831061073057505050916024359067ffffffffffffffff82116101515780602383011215610151578160040135906106ed61068f83610626565b926024602085858152019360051b82010191821161015157602401915b8183106107175750505090565b823580151581036101515781526020928301920161070a565b82356001600160a01b0381168103610151578152602092830192016106b2565b80518210156107645760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b035f5416330361078b57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea2646970667358221220f485daa5f9f2d44d23ef56b3fd6d86ad4155109e4bf89858c4d59af11182e90a64736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c8063090de7df1461054e578063163eed9e146105115780633d41132f146104735780636165567014610436578063680038c714610416578063715018a6146103b25780637d701102146103755780637e8d96371461031c57806384aaa2241461027e5780638da5cb5b146102595780638f72c13614610192578063d9d8edb9146101555763f2fde38b146100a8575f80fd5b34610151576020366003190112610151576001600160a01b036100c961063e565b6100d1610778565b168015610125576001600160a01b035f548273ffffffffffffffffffffffffffffffffffffffff198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5f80fd5b34610151576020366003190112610151576001600160a01b0361017661063e565b165f526001602052602060ff60405f2054166040519015158152f35b34610151576101a036610654565b6101a8610778565b8151815103610231575f5b825181101561022f57806001600160a01b036101d160019386610750565b51167f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f15060206102008487610750565b511515835f528582526102228160405f209060ff801983541691151516179055565b604051908152a2016101b3565b005b7feb175734000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610151575f3660031901126101515760206001600160a01b035f5416604051908152f35b346101515761028c36610654565b610294610778565b8151815103610231575f5b825181101561022f57806001600160a01b036102bd60019386610750565b51167fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c60206102ec8487610750565b511515835f526004825261030f8160405f209060ff801983541691151516179055565b604051908152a20161029f565b346101515760203660031901126101515760043560ff811680910361015157610343610778565b8060ff1960055416176005557f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b03585f80a2005b34610151576020366003190112610151576001600160a01b0361039661063e565b165f526002602052602060ff60405f2054166040519015158152f35b34610151575f366003190112610151576103ca610778565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610151575f36600319011261015157602060ff60055416604051908152f35b34610151576020366003190112610151576001600160a01b0361045761063e565b165f526004602052602060ff60405f2054166040519015158152f35b346101515761048136610654565b610489610778565b8151815103610231575f5b825181101561022f57806001600160a01b036104b260019386610750565b51167f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d992460206104e18487610750565b511515835f52600282526105048160405f209060ff801983541691151516179055565b604051908152a201610494565b34610151576020366003190112610151576001600160a01b0361053261063e565b165f526003602052602060ff60405f2054166040519015158152f35b346101515761055c36610654565b610564610778565b8151815103610231575f5b825181101561022f57806001600160a01b0361058d60019386610750565b51167ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c360206105bc8487610750565b511515835f52600382526105df8160405f209060ff801983541691151516179055565b604051908152a20161056f565b6040519190601f01601f1916820167ffffffffffffffff81118382101761061257604052565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff81116106125760051b60200190565b600435906001600160a01b038216820361015157565b9060406003198301126101515760043567ffffffffffffffff8111610151578260238201121561015157806004013561069461068f82610626565b6105ec565b916024602084848152019260051b8201019085821161015157602401915b81831061073057505050916024359067ffffffffffffffff82116101515780602383011215610151578160040135906106ed61068f83610626565b926024602085858152019360051b82010191821161015157602401915b8183106107175750505090565b823580151581036101515781526020928301920161070a565b82356001600160a01b0381168103610151578152602092830192016106b2565b80518210156107645760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b035f5416330361078b57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea2646970667358221220f485daa5f9f2d44d23ef56b3fd6d86ad4155109e4bf89858c4d59af11182e90a64736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
"immutableReferences": {},
"inputSourceName": "project/contracts/Controller.sol",
- "buildInfoId": "27822028aefba6db9743fbac66c2677f7feca3ad"
+ "buildInfoId": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#ICreateX.dbg.json
index e872235..7d8a2a7 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#ICreateX.dbg.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#ICreateX.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/27822028aefba6db9743fbac66c2677f7feca3ad.json"
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#ICreateX.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#ICreateX.json
index 0b1d6cc..ebe60ab 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#ICreateX.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Controller#ICreateX.json
@@ -47,5 +47,5 @@
"deployedLinkReferences": {},
"immutableReferences": {},
"inputSourceName": "project/contracts/interfaces/ICreateX.sol",
- "buildInfoId": "27822028aefba6db9743fbac66c2677f7feca3ad"
+ "buildInfoId": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
new file mode 100644
index 0000000..7d8a2a7
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
new file mode 100644
index 0000000..9a70c83
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#DynamicCallEncoder.json
@@ -0,0 +1,117 @@
+{
+ "_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": "DynamicCallEncoderEmptyDynamic",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderInvalidArgKind",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableOutOfBounds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DynamicCallEncoderVariableRefBadLength",
+ "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": "bool",
+ "name": "isDynamic",
+ "type": "bool"
+ }
+ ],
+ "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": "0x60808060405234601557610a06908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c63f964081d14610024575f80fd5b346101245760603660031901126101245760043567ffffffffffffffff8111610124576080600319823603011261012457610060610100604052565b806004013573ffffffffffffffffffffffffffffffffffffffff8116810361012457608052602481013560a05260448101357fffffffff00000000000000000000000000000000000000000000000000000000811681036101245760c05260648101359067ffffffffffffffff82116101245760046100e292369201016101f9565b60e05260243567ffffffffffffffff81116101245761011461010b6101209236906004016102d7565b604435906103f5565b604051918291826103cb565b0390f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761015857604052565b610128565b90601f8019910116810190811067ffffffffffffffff82111761015857604052565b67ffffffffffffffff81116101585760051b60200190565b67ffffffffffffffff811161015857601f01601f191660200190565b81601f82011215610124578035906101ca82610197565b926101d8604051948561015d565b8284526020838301011161012457815f926020809301838601378301015290565b9080601f83011215610124578135916102118361017f565b9261021f604051948561015d565b80845260208085019160051b830101918383116101245760208101915b83831061024b57505050505090565b823567ffffffffffffffff8111610124578201906060828703601f190112610124576040519161027a8361013c565b6020810135600281101561012457835260408101359067ffffffffffffffff8211610124576102b08860206060948401016101b3565b6020850152013590811515820361012457826020939260408594015281520192019161023c565b81601f82011215610124578035906102ee8261017f565b926102fc604051948561015d565b82845260208085019360051b830101918183116101245760208101935b83851061032857505050505090565b843567ffffffffffffffff811161012457820183603f820112156101245760208101356103548161017f565b91610362604051938461015d565b8183526020808085019360051b83010101918683116101245760408201905b83821061039b575050509082525060209485019401610319565b813567ffffffffffffffff8111610124576020916103c08a84808095890101016101b3565b815201910190610381565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b9190918051831161056f57917fffffffff0000000000000000000000000000000000000000000000000000000060c051169260e0519384519161043783610597565b90610441846105e0565b965f955f925b898785106104f05750505050506060928394915f905b82821061047657505050506104739394506106cc565b90565b909192959461048e610488848b610612565b51151590565b156104d6576104ca6104b76104a5896001946106a4565b976104b08686610612565b5190610672565b976104c28585610612565b51519061064e565b925b019092919261045d565b6104ea6001916104b085859a96999a610612565b956104cc565b8498866105548761048861056295610534839c9e9c6105218b8b8e9f60019d9e9f9061051b91610612565b51610757565b96875161052e8383610612565b52610612565b5061054d60208601936105478551151590565b92610612565b9015159052565b156104c2575060209061064e565b9701929190959395610447565b7f66e32eb4000000000000000000000000000000000000000000000000000000005f5260045ffd5b906105a18261017f565b6105ae604051918261015d565b82815280926105bf601f199161017f565b01905f5b8281106105cf57505050565b8060606020809385010152016105c3565b906105ea8261017f565b6105f7604051918261015d565b8281528092610608601f199161017f565b0190602036910137565b80518210156106265760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b9190820180921161065b57565b61063a565b805191908290602001825e015f815290565b6106a29061069461068e94936040519586936020850190610660565b90610660565b03601f19810184528361015d565b565b60206106a2916106be949360405195869284840190610660565b90815203808552018361015d565b6106947fffffffff00000000000000000000000000000000000000000000000000000000949361068e6106a2946040519788951660208601526024850190610660565b604051906040820182811067ffffffffffffffff821117610158576040525f602083606081520152565b6002111561074357565b634e487b7160e01b5f52602160045260245ffd5b909161076161070f565b50815160028110156107435761077681610739565b15610883576001825161078881610739565b61079181610739565b146107be577f51c907b2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6107c661070f565b506020820160408151510361085b5751926107ed6107e5856020015190565b946040015190565b91841015610833576107ff8482610612565b51518210156108335761082461082d9261081e61047396604094610612565b51610612565b51920151151590565b906108a0565b7f0c412584000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f893ed1c1000000000000000000000000000000000000000000000000000000005f5260045ffd5b50610473915061089161070f565b50604060208201519101511515905b9190916108ab61070f565b9281518015908115610946575b506108ec571561093c57604081511061091457602081810151036108ec5780516108e191610953565b825260016020830152565b7fdd42b1e5000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f3202a09c000000000000000000000000000000000000000000000000000000005f5260045ffd5b82525f6020830152565b601f16905015155f6108b8565b9190602081106109a857825181116109a857601f19810190811161065b5761097a81610197565b610987604051918261015d565b818152604061099583610197565b602083019290601f19013684379401905e565b7f326b3d3a000000000000000000000000000000000000000000000000000000005f5260045ffdfea264697066735822122032fe629b918005398497db4d49a65446f6554c13dde6a07068bf9a13aeadaf7864736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c63f964081d14610024575f80fd5b346101245760603660031901126101245760043567ffffffffffffffff8111610124576080600319823603011261012457610060610100604052565b806004013573ffffffffffffffffffffffffffffffffffffffff8116810361012457608052602481013560a05260448101357fffffffff00000000000000000000000000000000000000000000000000000000811681036101245760c05260648101359067ffffffffffffffff82116101245760046100e292369201016101f9565b60e05260243567ffffffffffffffff81116101245761011461010b6101209236906004016102d7565b604435906103f5565b604051918291826103cb565b0390f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761015857604052565b610128565b90601f8019910116810190811067ffffffffffffffff82111761015857604052565b67ffffffffffffffff81116101585760051b60200190565b67ffffffffffffffff811161015857601f01601f191660200190565b81601f82011215610124578035906101ca82610197565b926101d8604051948561015d565b8284526020838301011161012457815f926020809301838601378301015290565b9080601f83011215610124578135916102118361017f565b9261021f604051948561015d565b80845260208085019160051b830101918383116101245760208101915b83831061024b57505050505090565b823567ffffffffffffffff8111610124578201906060828703601f190112610124576040519161027a8361013c565b6020810135600281101561012457835260408101359067ffffffffffffffff8211610124576102b08860206060948401016101b3565b6020850152013590811515820361012457826020939260408594015281520192019161023c565b81601f82011215610124578035906102ee8261017f565b926102fc604051948561015d565b82845260208085019360051b830101918183116101245760208101935b83851061032857505050505090565b843567ffffffffffffffff811161012457820183603f820112156101245760208101356103548161017f565b91610362604051938461015d565b8183526020808085019360051b83010101918683116101245760408201905b83821061039b575050509082525060209485019401610319565b813567ffffffffffffffff8111610124576020916103c08a84808095890101016101b3565b815201910190610381565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b9190918051831161056f57917fffffffff0000000000000000000000000000000000000000000000000000000060c051169260e0519384519161043783610597565b90610441846105e0565b965f955f925b898785106104f05750505050506060928394915f905b82821061047657505050506104739394506106cc565b90565b909192959461048e610488848b610612565b51151590565b156104d6576104ca6104b76104a5896001946106a4565b976104b08686610612565b5190610672565b976104c28585610612565b51519061064e565b925b019092919261045d565b6104ea6001916104b085859a96999a610612565b956104cc565b8498866105548761048861056295610534839c9e9c6105218b8b8e9f60019d9e9f9061051b91610612565b51610757565b96875161052e8383610612565b52610612565b5061054d60208601936105478551151590565b92610612565b9015159052565b156104c2575060209061064e565b9701929190959395610447565b7f66e32eb4000000000000000000000000000000000000000000000000000000005f5260045ffd5b906105a18261017f565b6105ae604051918261015d565b82815280926105bf601f199161017f565b01905f5b8281106105cf57505050565b8060606020809385010152016105c3565b906105ea8261017f565b6105f7604051918261015d565b8281528092610608601f199161017f565b0190602036910137565b80518210156106265760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b9190820180921161065b57565b61063a565b805191908290602001825e015f815290565b6106a29061069461068e94936040519586936020850190610660565b90610660565b03601f19810184528361015d565b565b60206106a2916106be949360405195869284840190610660565b90815203808552018361015d565b6106947fffffffff00000000000000000000000000000000000000000000000000000000949361068e6106a2946040519788951660208601526024850190610660565b604051906040820182811067ffffffffffffffff821117610158576040525f602083606081520152565b6002111561074357565b634e487b7160e01b5f52602160045260245ffd5b909161076161070f565b50815160028110156107435761077681610739565b15610883576001825161078881610739565b61079181610739565b146107be577f51c907b2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6107c661070f565b506020820160408151510361085b5751926107ed6107e5856020015190565b946040015190565b91841015610833576107ff8482610612565b51518210156108335761082461082d9261081e61047396604094610612565b51610612565b51920151151590565b906108a0565b7f0c412584000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f893ed1c1000000000000000000000000000000000000000000000000000000005f5260045ffd5b50610473915061089161070f565b50604060208201519101511515905b9190916108ab61070f565b9281518015908115610946575b506108ec571561093c57604081511061091457602081810151036108ec5780516108e191610953565b825260016020830152565b7fdd42b1e5000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f3202a09c000000000000000000000000000000000000000000000000000000005f5260045ffd5b82525f6020830152565b601f16905015155f6108b8565b9190602081106109a857825181116109a857601f19810190811161065b5761097a81610197565b610987604051918261015d565b818152604061099583610197565b602083019290601f19013684379401905e565b7f326b3d3a000000000000000000000000000000000000000000000000000000005f5260045ffdfea264697066735822122032fe629b918005398497db4d49a65446f6554c13dde6a07068bf9a13aeadaf7864736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/dynamic-calls/DynamicCallEncoder.sol",
+ "buildInfoId": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
new file mode 100644
index 0000000..7d8a2a7
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#ICreateX.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3DynamicCallEncoder#ICreateX.json
new file mode 100644
index 0000000..ebe60ab
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/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": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#ICreateX.dbg.json
index 817dddf..7d8a2a7 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#ICreateX.dbg.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#ICreateX.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/b650d0a8e9df290d290e91b2999a1f7443c2b528.json"
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#ICreateX.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#ICreateX.json
index a4701c6..ebe60ab 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#ICreateX.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#ICreateX.json
@@ -47,5 +47,5 @@
"deployedLinkReferences": {},
"immutableReferences": {},
"inputSourceName": "project/contracts/interfaces/ICreateX.sol",
- "buildInfoId": "b650d0a8e9df290d290e91b2999a1f7443c2b528"
+ "buildInfoId": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#MimicHelper.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#MimicHelper.dbg.json
index dec9a21..7d8a2a7 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#MimicHelper.dbg.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#MimicHelper.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/2ea009b03700817d235b9901c3ebe6048e01a993.json"
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#MimicHelper.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#MimicHelper.json
index dee9164..fb34687 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#MimicHelper.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3MimicHelper#MimicHelper.json
@@ -3,6 +3,11 @@
"contractName": "MimicHelper",
"sourceName": "contracts/utils/MimicHelper.sol",
"abi": [
+ {
+ "inputs": [],
+ "name": "MimicHelperInvalidPercent",
+ "type": "error"
+ },
{
"anonymous": false,
"inputs": [
@@ -90,6 +95,30 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint16",
+ "name": "percent",
+ "type": "uint16"
+ }
+ ],
+ "name": "pct",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
{
"inputs": [
{
@@ -109,11 +138,11 @@
"type": "function"
}
],
- "bytecode": "0x6080604052348015600e575f5ffd5b506105f48061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80631c1bbd371461004e57806353f71fd3146100635780637e105ce21461008c578063effd663c1461009f575b5f5ffd5b61006161005c3660046102b9565b6100c8565b005b6100766100713660046103b6565b610161565b6040516100839190610405565b60405180910390f35b61007661009a36600461043a565b610233565b6100ba6100ad36600461043a565b6001600160a01b03163190565b604051908152602001610083565b335f908152602081905260409081902090518291906100ea908690869061045a565b9081526020016040518091039020908161010491906104ed565b508060405161011391906105a8565b6040518091039020838360405161012b92919061045a565b6040519081900381209033907f56ab5c6148f0ccf4e18c36573ddf31db2c597b58811188358cc6935661a38836905f90a4505050565b60605f5f856001600160a01b03166001600160a01b031681526020019081526020015f20838360405161019592919061045a565b908152602001604051809103902080546101ae90610469565b80601f01602080910402602001604051908101604052809291908181526020018280546101da90610469565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505090509392505050565b6060816001600160a01b0316803b806020016040519081016040528181525f908060200190933c92915050565b5f5f83601f840112610270575f5ffd5b50813567ffffffffffffffff811115610287575f5ffd5b60208301915083602082850101111561029e575f5ffd5b9250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f604084860312156102cb575f5ffd5b833567ffffffffffffffff8111156102e1575f5ffd5b6102ed86828701610260565b909450925050602084013567ffffffffffffffff81111561030c575f5ffd5b8401601f8101861361031c575f5ffd5b803567ffffffffffffffff811115610336576103366102a5565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610365576103656102a5565b60405281815282820160200188101561037c575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b80356001600160a01b03811681146103b1575f5ffd5b919050565b5f5f5f604084860312156103c8575f5ffd5b6103d18461039b565b9250602084013567ffffffffffffffff8111156103ec575f5ffd5b6103f886828701610260565b9497909650939450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561044a575f5ffd5b6104538261039b565b9392505050565b818382375f9101908152919050565b600181811c9082168061047d57607f821691505b60208210810361049b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156104e857805f5260205f20601f840160051c810160208510156104c65750805b601f840160051c820191505b818110156104e5575f81556001016104d2565b50505b505050565b815167ffffffffffffffff811115610507576105076102a5565b61051b816105158454610469565b846104a1565b6020601f82116001811461054d575f83156105365750848201515b5f19600385901b1c1916600184901b1784556104e5565b5f84815260208120601f198516915b8281101561057c578785015182556020948501946001909201910161055c565b508482101561059957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f92019182525091905056fea26469706673582212203ecf313e33ffc17bcc5dffe1fa123cd9bf2d3c584d41391a2f7f78513def6ed364736f6c634300081c0033",
- "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80631c1bbd371461004e57806353f71fd3146100635780637e105ce21461008c578063effd663c1461009f575b5f5ffd5b61006161005c3660046102b9565b6100c8565b005b6100766100713660046103b6565b610161565b6040516100839190610405565b60405180910390f35b61007661009a36600461043a565b610233565b6100ba6100ad36600461043a565b6001600160a01b03163190565b604051908152602001610083565b335f908152602081905260409081902090518291906100ea908690869061045a565b9081526020016040518091039020908161010491906104ed565b508060405161011391906105a8565b6040518091039020838360405161012b92919061045a565b6040519081900381209033907f56ab5c6148f0ccf4e18c36573ddf31db2c597b58811188358cc6935661a38836905f90a4505050565b60605f5f856001600160a01b03166001600160a01b031681526020019081526020015f20838360405161019592919061045a565b908152602001604051809103902080546101ae90610469565b80601f01602080910402602001604051908101604052809291908181526020018280546101da90610469565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505090509392505050565b6060816001600160a01b0316803b806020016040519081016040528181525f908060200190933c92915050565b5f5f83601f840112610270575f5ffd5b50813567ffffffffffffffff811115610287575f5ffd5b60208301915083602082850101111561029e575f5ffd5b9250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f604084860312156102cb575f5ffd5b833567ffffffffffffffff8111156102e1575f5ffd5b6102ed86828701610260565b909450925050602084013567ffffffffffffffff81111561030c575f5ffd5b8401601f8101861361031c575f5ffd5b803567ffffffffffffffff811115610336576103366102a5565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610365576103656102a5565b60405281815282820160200188101561037c575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b80356001600160a01b03811681146103b1575f5ffd5b919050565b5f5f5f604084860312156103c8575f5ffd5b6103d18461039b565b9250602084013567ffffffffffffffff8111156103ec575f5ffd5b6103f886828701610260565b9497909650939450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561044a575f5ffd5b6104538261039b565b9392505050565b818382375f9101908152919050565b600181811c9082168061047d57607f821691505b60208210810361049b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156104e857805f5260205f20601f840160051c810160208510156104c65750805b601f840160051c820191505b818110156104e5575f81556001016104d2565b50505b505050565b815167ffffffffffffffff811115610507576105076102a5565b61051b816105158454610469565b846104a1565b6020601f82116001811461054d575f83156105365750848201515b5f19600385901b1c1916600184901b1784556104e5565b5f84815260208120601f198516915b8281101561057c578785015182556020948501946001909201910161055c565b508482101561059957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f92019182525091905056fea26469706673582212203ecf313e33ffc17bcc5dffe1fa123cd9bf2d3c584d41391a2f7f78513def6ed364736f6c634300081c0033",
+ "bytecode": "0x60808060405234601557610604908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80631c1bbd371461024b57806353f71fd31461012e5780637e105ce2146100df578063e7032021146100785763effd663c14610050575f80fd5b3461007457602036600319011261007457602061006b6104c5565b31604051908152f35b5f80fd5b346100745760403660031901126100745760243561ffff81168091036100745761271081116100b7576100af60209160043561054a565b604051908152f35b7fdd9d6426000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100745760203660031901126100745761012a6100fb6104c5565b803b5f610107826104a9565b926101156040519485610487565b82845260208401903c604051918291826104e8565b0390f35b34610074576040366003190112610074576101476104c5565b60243567ffffffffffffffff81116100745773ffffffffffffffffffffffffffffffffffffffff9161017f6020923690600401610459565b939091165f525f825260405f20836040519485938437820190815203019020604051905f908054906101b082610512565b808552916001811690811561022457506001146101e4575b61012a846101d881860382610487565b604051918291826104e8565b5f90815260208120939250905b80821061020a575090915081016020016101d8826101c8565b9192600181602092548385880101520191019092916101f1565b60ff191660208087019190915292151560051b850190920192506101d891508390506101c8565b346100745760403660031901126100745760043567ffffffffffffffff81116100745761027c903690600401610459565b6024359067ffffffffffffffff82116100745736602383011215610074578160040135926102a9846104a9565b936102b76040519586610487565b8085526020850193366024838301011161007457815f92602460209301873786010152335f525f60205260405f20602060405180928585833785820190815203019020845167ffffffffffffffff8111610445576103158254610512565b601f8111610400575b50806020601f821160011461039f575f91610394575b508160011b915f199060031b1c19161790555b81604051928392833781015f815203902091604051918291518091835e81015f815203902090337f56ab5c6148f0ccf4e18c36573ddf31db2c597b58811188358cc6935661a388365f80a4005b905086015187610334565b5f8481528181209250601f198416905b8181106103e8575090836001949392106103d0575b5050811b019055610347565b8801515f1960f88460031b161c1916905587806103c4565b9192602060018192868d0151815501940192016103af565b825f5260205f20601f830160051c8101916020841061043b575b601f0160051c01905b818110610430575061031e565b5f8155600101610423565b909150819061041a565b634e487b7160e01b5f52604160045260245ffd5b9181601f840112156100745782359167ffffffffffffffff8311610074576020838186019501011161007457565b90601f8019910116810190811067ffffffffffffffff82111761044557604052565b67ffffffffffffffff811161044557601f01601f191660200190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361007457565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b90600182811c92168015610540575b602083101461052c57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610521565b9091905f905f1984820990848102928380841093039280840393146105c1578261271011156105af57507fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e919394612710910990828211900360fc1b910360041c170290565b634e487b71905260116020526024601cfd5b505050612710919250049056fea26469706673582212207102bef7cae26c021466dcd8e471e5727409d7eb7c52d658932ae94dca17d5d664736f6c634300081c0033",
+ "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c80631c1bbd371461024b57806353f71fd31461012e5780637e105ce2146100df578063e7032021146100785763effd663c14610050575f80fd5b3461007457602036600319011261007457602061006b6104c5565b31604051908152f35b5f80fd5b346100745760403660031901126100745760243561ffff81168091036100745761271081116100b7576100af60209160043561054a565b604051908152f35b7fdd9d6426000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100745760203660031901126100745761012a6100fb6104c5565b803b5f610107826104a9565b926101156040519485610487565b82845260208401903c604051918291826104e8565b0390f35b34610074576040366003190112610074576101476104c5565b60243567ffffffffffffffff81116100745773ffffffffffffffffffffffffffffffffffffffff9161017f6020923690600401610459565b939091165f525f825260405f20836040519485938437820190815203019020604051905f908054906101b082610512565b808552916001811690811561022457506001146101e4575b61012a846101d881860382610487565b604051918291826104e8565b5f90815260208120939250905b80821061020a575090915081016020016101d8826101c8565b9192600181602092548385880101520191019092916101f1565b60ff191660208087019190915292151560051b850190920192506101d891508390506101c8565b346100745760403660031901126100745760043567ffffffffffffffff81116100745761027c903690600401610459565b6024359067ffffffffffffffff82116100745736602383011215610074578160040135926102a9846104a9565b936102b76040519586610487565b8085526020850193366024838301011161007457815f92602460209301873786010152335f525f60205260405f20602060405180928585833785820190815203019020845167ffffffffffffffff8111610445576103158254610512565b601f8111610400575b50806020601f821160011461039f575f91610394575b508160011b915f199060031b1c19161790555b81604051928392833781015f815203902091604051918291518091835e81015f815203902090337f56ab5c6148f0ccf4e18c36573ddf31db2c597b58811188358cc6935661a388365f80a4005b905086015187610334565b5f8481528181209250601f198416905b8181106103e8575090836001949392106103d0575b5050811b019055610347565b8801515f1960f88460031b161c1916905587806103c4565b9192602060018192868d0151815501940192016103af565b825f5260205f20601f830160051c8101916020841061043b575b601f0160051c01905b818110610430575061031e565b5f8155600101610423565b909150819061041a565b634e487b7160e01b5f52604160045260245ffd5b9181601f840112156100745782359167ffffffffffffffff8311610074576020838186019501011161007457565b90601f8019910116810190811067ffffffffffffffff82111761044557604052565b67ffffffffffffffff811161044557601f01601f191660200190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361007457565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b90600182811c92168015610540575b602083101461052c57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610521565b9091905f905f1984820990848102928380841093039280840393146105c1578261271011156105af57507fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e919394612710910990828211900360fc1b910360041c170290565b634e487b71905260116020526024601cfd5b505050612710919250049056fea26469706673582212207102bef7cae26c021466dcd8e471e5727409d7eb7c52d658932ae94dca17d5d664736f6c634300081c0033",
"linkReferences": {},
"deployedLinkReferences": {},
"immutableReferences": {},
"inputSourceName": "project/contracts/utils/MimicHelper.sol",
- "buildInfoId": "2ea009b03700817d235b9901c3ebe6048e01a993"
+ "buildInfoId": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Proxy#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Proxy#ICreateX.dbg.json
new file mode 100644
index 0000000..7d8a2a7
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Proxy#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Proxy#ICreateX.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Proxy#ICreateX.json
new file mode 100644
index 0000000..ebe60ab
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/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": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Proxy#Proxy.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Proxy#Proxy.dbg.json
new file mode 100644
index 0000000..7d8a2a7
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Proxy#Proxy.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Proxy#Proxy.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Proxy#Proxy.json
new file mode 100644
index 0000000..feb7485
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/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": "0x60a060405234610268575f610c2c8038038061001a8161026c565b928339810160608282031261026857610032826102a5565b9061003f602084016102a5565b604084015190936001600160401b038211610268570181601f8201121561026857805161007361006e826102b9565b61026c565b9181835260208301936020838301011161026857815f926020809301865e83010152823b1561024a577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0385169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a280511561023e5784610134939281925190845af43d15610236573d9161012561006e846102b9565b9283523d86602085013e6102d4565b505b604051906104d080830191906001600160401b038311848410176102225791839160209361073c84396001600160a01b0316815203019082f080156102155760018060a01b031690816080525f516020610c0c5f395f51905f5254907f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6040805160018060a01b0385168152856020820152a1821561020157506001600160a01b031916175f516020610c0c5f395f51905f5255604051610409908161033382396080518160070152f35b633173bdd160e11b81526004819052602490fd5b50604051903d90823e3d90fd5b634e487b7160e01b85526041600452602485fd5b6060916102d4565b50505090505f90610136565b634c9c8ce360e01b5f9081526001600160a01b038416600452602490fd5b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761029157604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361026857565b6001600160401b03811161029157601f01601f191660200190565b906102f857508051156102e957805190602001fd5b63d6bda27560e01b5f5260045ffd5b81511580610329575b610309575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561030156fe6080604052337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316036100b0575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100a6577fd2b576ec000000000000000000000000000000000000000000000000000000005f5260045ffd5b6100ae61016b565b005b5f806001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416368280378136915af43d5f803e156100f3573d5ff35b3d5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761014a57604052565b6100f7565b67ffffffffffffffff811161014a57601f01601f191660200190565b366004116101f35760403660031901126101f3576004356001600160a01b0381168091036101f3576024359067ffffffffffffffff82116101f357366023830112156101f3578160040135906101c86101c38361014f565b610124565b9180835236602482860101116101f3576020815f9260246101f1970183870137840101526101f7565b565b5f80fd5b90813b156102d9576001600160a01b038216807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28051156102a8576102a59161030e565b50565b5050346102b157565b7fb398979f000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b03827f4c9c8ce3000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b5f8061034093602081519101845af43d15610343573d916103316101c38461014f565b9283523d5f602085013e610347565b90565b6060915b90610384575080511561035c57805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b815115806103ca575b610395575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b1561038d56fea26469706673582212205fb1ef45360fa87114903ac7ff35f8b50aae4101722212022b0f178738a978ad64736f6c634300081c003360803460b857601f6104d038819003918201601f19168301916001600160401b0383118484101760bc5780849260209460405283398101031260b857516001600160a01b0381169081900360b857801560a5575f80546001600160a01b031981168317825560405192916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36103ff90816100d18239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f5f3560e01c8063715018a6146102e05780638da5cb5b146102bb5780639623609d14610168578063ad3cb1cc146101035763f2fde38b14610051575f80fd5b34610100576020366003190112610100576004356001600160a01b0381168091036100fe5761007e61038a565b80156100d2576001600160a01b0382548273ffffffffffffffffffffffffffffffffffffffff198216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6024827f1e4fbdf700000000000000000000000000000000000000000000000000000000815280600452fd5b505b80fd5b503461010057806003193601126101005750610164604051610126604082610344565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190610366565b0390f35b50606036600319011261028a576004356001600160a01b03811680910361028a576024356001600160a01b03811680910361028a5760443567ffffffffffffffff811161028a573660238201121561028a57806004013567ffffffffffffffff811161028e57604051916101e6601f8301601f191660200184610344565b818352366024838301011161028a57815f92602460209301838601378301015261020e61038a565b823b1561028a5761025d925f926040518095819482937f4f1ef2860000000000000000000000000000000000000000000000000000000084526004840152604060248401526044830190610366565b039134905af1801561027f57610271575080f35b61027d91505f90610344565b005b6040513d5f823e3d90fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b3461028a575f36600319011261028a5760206001600160a01b035f5416604051908152f35b3461028a575f36600319011261028a576102f861038a565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b90601f8019910116810190811067ffffffffffffffff82111761028e57604052565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6001600160a01b035f5416330361039d57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea264697066735822122087ed775a4d6d3ac2f30f3ac551807433be2f1f5c398ad2935bfd3a3586ec9ec464736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
+ "deployedBytecode": "0x6080604052337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316036100b0575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100a6577fd2b576ec000000000000000000000000000000000000000000000000000000005f5260045ffd5b6100ae61016b565b005b5f806001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416368280378136915af43d5f803e156100f3573d5ff35b3d5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761014a57604052565b6100f7565b67ffffffffffffffff811161014a57601f01601f191660200190565b366004116101f35760403660031901126101f3576004356001600160a01b0381168091036101f3576024359067ffffffffffffffff82116101f357366023830112156101f3578160040135906101c86101c38361014f565b610124565b9180835236602482860101116101f3576020815f9260246101f1970183870137840101526101f7565b565b5f80fd5b90813b156102d9576001600160a01b038216807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28051156102a8576102a59161030e565b50565b5050346102b157565b7fb398979f000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b03827f4c9c8ce3000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b5f8061034093602081519101845af43d15610343573d916103316101c38461014f565b9283523d5f602085013e610347565b90565b6060915b90610384575080511561035c57805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b815115806103ca575b610395575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b1561038d56fea26469706673582212205fb1ef45360fa87114903ac7ff35f8b50aae4101722212022b0f178738a978ad64736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "1869": [
+ {
+ "length": 32,
+ "start": 7
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/proxy/Proxy.sol",
+ "buildInfoId": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#ICreateX.dbg.json
index e872235..7d8a2a7 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#ICreateX.dbg.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#ICreateX.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/27822028aefba6db9743fbac66c2677f7feca3ad.json"
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#ICreateX.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#ICreateX.json
index 0b1d6cc..ebe60ab 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#ICreateX.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#ICreateX.json
@@ -47,5 +47,5 @@
"deployedLinkReferences": {},
"immutableReferences": {},
"inputSourceName": "project/contracts/interfaces/ICreateX.sol",
- "buildInfoId": "27822028aefba6db9743fbac66c2677f7feca3ad"
+ "buildInfoId": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#Settler.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#Settler.dbg.json
index e872235..7d8a2a7 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#Settler.dbg.json
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#Settler.dbg.json
@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
- "buildInfo": "../build-info/27822028aefba6db9743fbac66c2677f7feca3ad.json"
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#Settler.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#Settler.json
index d6affec..c78f71f 100644
--- a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3Settler#Settler.json
+++ b/packages/evm/ignition/deployments/chain-84532/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",
@@ -323,6 +337,49 @@
"name": "SettlerRescueFundsRecipientZero",
"type": "error"
},
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ }
+ ],
+ "name": "SettlerSafeguardInvalidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ }
+ ],
+ "name": "SettlerSafeguardNonceAlreadyUsed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "timestamp",
+ "type": "uint256"
+ }
+ ],
+ "name": "SettlerSafeguardPastDeadline",
+ "type": "error"
+ },
{
"inputs": [
{
@@ -381,11 +438,11 @@
"inputs": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
}
],
- "name": "SettlerUnknownIntentType",
+ "name": "SettlerUnknownOperationType",
"type": "error"
},
{
@@ -432,15 +489,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 +532,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 +563,14 @@
{
"indexed": true,
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
"components": [
{
"internalType": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -506,43 +578,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 +596,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 +614,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -604,6 +629,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 +654,7 @@
"type": "bytes"
}
],
- "name": "IntentExecuted",
+ "name": "OperationExecuted",
"type": "event"
},
{
@@ -626,11 +663,11 @@
{
"indexed": true,
"internalType": "address",
- "name": "intentsValidator",
+ "name": "operationsValidator",
"type": "address"
}
],
- "name": "IntentsValidatorSet",
+ "name": "OperationsValidatorSet",
"type": "event"
},
{
@@ -660,12 +697,6 @@
"internalType": "bytes32",
"name": "proposal",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint256",
- "name": "index",
- "type": "uint256"
}
],
"name": "ProposalExecuted",
@@ -710,6 +741,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "dynamicCallEncoder",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "eip712Domain",
@@ -757,11 +801,63 @@
"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": "address",
+ "name": "token",
+ "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": "uint8",
- "name": "op",
+ "name": "opType",
"type": "uint8"
},
{
@@ -770,41 +866,9 @@
"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[]"
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
},
{
"components": [
@@ -819,61 +883,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 +930,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 +973,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -932,26 +990,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 +1004,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 +1061,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 +1071,9 @@
"type": "uint256"
},
{
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
+ "internalType": "bytes[]",
+ "name": "datas",
+ "type": "bytes[]"
},
{
"internalType": "uint256[]",
@@ -1031,14 +1087,9 @@
},
{
"components": [
- {
- "internalType": "uint8",
- "name": "op",
- "type": "uint8"
- },
{
"internalType": "address",
- "name": "user",
+ "name": "feePayer",
"type": "address"
},
{
@@ -1056,11 +1107,6 @@
"name": "deadline",
"type": "uint256"
},
- {
- "internalType": "bytes",
- "name": "data",
- "type": "bytes"
- },
{
"components": [
{
@@ -1078,26 +1124,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 +1138,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 +1219,56 @@
"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": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "isUserSafeguardNonceUsed",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
- "name": "intentsValidator",
+ "name": "operationsValidator",
"outputs": [
{
"internalType": "address",
@@ -1211,11 +1326,24 @@
"inputs": [
{
"internalType": "address",
- "name": "newIntentsValidator",
+ "name": "newDynamicCallEncoder",
"type": "address"
}
],
- "name": "setIntentsValidator",
+ "name": "setDynamicCallEncoder",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOperationsValidator",
+ "type": "address"
+ }
+ ],
+ "name": "setOperationsValidator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1233,6 +1361,46 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "user",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "safeguard",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "nonce",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "deadline",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct SafeguardAuthorization",
+ "name": "authorization",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "setSafeguardWithSignature",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [
{
@@ -1250,55 +1418,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 +1500,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 +1578,11 @@
"type": "receive"
}
],
- "bytecode": "0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122063c7f17d2676ae9340ccf0078bc40725749c3c4dd9198f82832bc411d2d1333764736f6c634300081c0033",
- "deployedBytecode": "0x60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c0033",
+ "bytecode": "0x6080806040523460aa575f516020615bc85f395f51905f525460ff8160401c16609b576002600160401b03196001600160401b038216016049575b604051615b1990816100af8239f35b6001600160401b0319166001600160401b039081175f516020615bc85f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80603a565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80630fc27cf614610179578063403b5659146101745780634987ed2f1461016f57806355ef9b861461016a5780636ccae05414610165578063715018a61461016057806384b0196e1461015b57806384d44e28146101565780638da5cb5b14610151578063911929df1461014c5780639479591614610147578063950026511461014257806396d45f511461013d5780639c2a2c6e146101385780639f86fded14610133578063a49eacff1461012e578063c0c53b8b14610129578063cbc9104514610124578063e5814ea61461011f578063f2fde38b1461011a578063f77c4791146101155763faa390d70361000e576112aa565b611285565b611258565b611232565b6111f8565b610fbb565b610f55565b610edd565b610eb7565b610e8a565b610e19565b610d68565b610821565b6107dc565b6107b2565b6106bd565b610554565b610478565b610429565b610403565b610344565b6101a0565b6001600160a01b0381160361018f57565b5f80fd5b359061019e8261017e565b565b3461018f57602036600319011261018f576001600160a01b036004356101c58161017e565b6101cd611ebd565b16801561020c57806001600160a01b031960015416176001557f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e6545f80a2005b7f42af048a000000000000000000000000000000000000000000000000000000005f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6080810190811067ffffffffffffffff82111761026457604052565b610234565b6040810190811067ffffffffffffffff82111761026457604052565b6060810190811067ffffffffffffffff82111761026457604052565b90601f8019910116810190811067ffffffffffffffff82111761026457604052565b6040519061019e610120836102a1565b6040519061019e6020836102a1565b67ffffffffffffffff811161026457601f01601f191660200190565b81601f8201121561018f57803590610315826102e2565b9261032360405194856102a1565b8284526020838301011161018f57815f926020809301838601378301015290565b3461018f57604036600319011261018f5760043567ffffffffffffffff811161018f576080600319823603011261018f576040519061038282610248565b80600401356103908161017e565b825260248101359067ffffffffffffffff821161018f576103b9606492600436918401016102fe565b602084015260448101356040840152013560608201526024359067ffffffffffffffff821161018f576103f36100189236906004016102fe565b906112e5565b5f91031261018f57565b3461018f575f36600319011261018f5760206001600160a01b0360015416604051908152f35b3461018f57604036600319011261018f576004356104468161017e565b6001600160a01b0360243591165f52600660205260405f20905f52602052602060ff60405f2054166040519015158152f35b3461018f57606036600319011261018f576004356104958161017e565b6024356104a18161017e565b604435906104ad611ebd565b6104b5612366565b6001600160a01b03811692831561052c576001600160a01b03816104fd857fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805956020956123dd565b6040519485521692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b7f54328a09000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461018f575f36600319011261018f5761056c611ebd565b5f6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90602080835192838152019201905f5b81811061062c5750505090565b825184526020938401939092019160010161061f565b919361069b6106ba96949561068d6001600160a01b03947f0f00000000000000000000000000000000000000000000000000000000000000875260e0602088015260e08701906105eb565b9085820360408701526105eb565b9460608401521660808201525f60a082015260c081840391015261060f565b90565b3461018f575f36600319011261018f577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610789575b1561072b576107036124ba565b61070b6125ab565b9061072761071761143d565b6040519384933091469186610642565b0390f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10154156106f6565b3461018f57602036600319011261018f576004355f526004602052602060405f2054604051908152f35b3461018f575f36600319011261018f5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461018f57602036600319011261018f576001600160a01b036004356108468161017e565b165f52600560205261072761086761086e60405f20604051928380926114c2565b03826102a1565b6040519182916020835260208301906105eb565b67ffffffffffffffff81116102645760051b60200190565b81601f8201121561018f578035906108b182610882565b926108bf60405194856102a1565b82845260208085019360061b8301019181831161018f57602001925b8284106108e9575050505090565b60408483031261018f576020604091825161090381610269565b863561090e8161017e565b815282870135838201528152019301926108db565b9080601f8301121561018f57813561093a81610882565b9261094860405194856102a1565b81845260208085019260051b8201019183831161018f5760208201905b83821061097457505050505090565b813567ffffffffffffffff811161018f57602091610997878480948801016102fe565b815201910190610965565b60ff81160361018f57565b9080601f8301121561018f578135916109c583610882565b926109d360405194856102a1565b80845260208085019160051b8301019183831161018f5760208101915b8383106109ff57505050505090565b823567ffffffffffffffff811161018f5782016080818703601f19011261018f5760405190610a2d82610248565b6020810135610a3b816109a2565b82526040810135610a4b8161017e565b6020830152606081013567ffffffffffffffff811161018f57876020610a73928401016102fe565b6040830152608081013567ffffffffffffffff811161018f57602091010186601f8201121561018f57803590610aa882610882565b91610ab660405193846102a1565b80835260208084019160051b8301019189831161018f5760208101915b838310610af1575050505060608201528152602092830192016109f0565b823567ffffffffffffffff811161018f578201906040828d03601f19011261018f5760405190610b2082610269565b6020830135825260408301359167ffffffffffffffff831161018f57610b4e8e6020809695819601016102fe565b83820152815201920191610ad3565b9190916101208184031261018f57610b736102c3565b92610b7d82610193565b8452610b8b60208301610193565b60208501526040820135604085015260608201356060850152608082013567ffffffffffffffff811161018f5781610bc491840161089a565b608085015260a082013567ffffffffffffffff811161018f5781610be99184016102fe565b60a085015260c082013560c085015260e082013567ffffffffffffffff811161018f5781610c18918401610923565b60e085015261010082013567ffffffffffffffff811161018f57610c3c92016109ad565b610100830152565b919060608382031261018f57604051610c5c81610285565b809380358252602081013567ffffffffffffffff811161018f5783610c82918301610923565b602083015260408101359067ffffffffffffffff821161018f57019180601f8401121561018f578235610cb481610882565b93610cc260405195866102a1565b81855260208086019260051b82010192831161018f57602001905b828210610ced5750505060400152565b8135815260209182019101610cdd565b606060031982011261018f5760043567ffffffffffffffff811161018f5781610d2891600401610b5d565b9160243567ffffffffffffffff811161018f5782610d4891600401610c44565b916044359067ffffffffffffffff821161018f576106ba916004016102fe565b3461018f57610d7636610cfd565b5f5460405163d9d8edb960e01b815233600482015291939190602090829060249082906001600160a01b03165afa908115610e14575f91610de5575b506115ab575b7fa7ac57a9000000000000000000000000000000000000000000000000000000005f523360045260245b5ffd5b610e07915060203d602011610e0d575b610dff81836102a1565b81019061156b565b5f610db2565b503d610df5565b61157f565b3461018f57606036600319011261018f5760043567ffffffffffffffff811161018f57610e4a903690600401610c44565b60243567ffffffffffffffff811161018f57602091610e70610e82923690600401610b5d565b60443591610e7d8361017e565b612b2f565b604051908152f35b3461018f57602036600319011261018f57610018600435610eaa8161017e565b610eb2611ebd565b612c12565b3461018f575f36600319011261018f5760206001600160a01b0360035416604051908152f35b3461018f57610eeb36610cfd565b5f5460405163d9d8edb960e01b815233600482015291929190602090829060249082906001600160a01b03165afa908115610e14575f91610f36575b5015610db8576100189261267c565b610f4f915060203d602011610e0d57610dff81836102a1565b5f610f27565b3461018f57602036600319011261018f576001600160a01b03600435610f7a8161017e565b610f82611ebd565b16806001600160a01b031960025416176002557f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef75f80a2005b3461018f57606036600319011261018f57600435610fd88161017e565b60243590610fe58261017e565b604435610ff18161017e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549267ffffffffffffffff61104060ff604087901c1615611032565b1590565b9567ffffffffffffffff1690565b16801590816111f0575b60011490816111e6575b1590816111dd575b506111b5576110c692846110bd600167ffffffffffffffff197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b61115057611cfa565b6110cc57005b61112168ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6111b06801000000000000000068ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b611cfa565b7ff92ee8a9000000000000000000000000000000000000000000000000000000005f5260045ffd5b9050155f61105c565b303b159150611054565b85915061104a565b3461018f57602036600319011261018f5760043567ffffffffffffffff811161018f5761122c6100189136906004016102fe565b3361229e565b3461018f575f36600319011261018f5760206001600160a01b0360025416604051908152f35b3461018f57602036600319011261018f576100186004356112788161017e565b611280611ebd565b611e02565b3461018f575f36600319011261018f5760206001600160a01b035f5416604051908152f35b3461018f57602036600319011261018f5760043567ffffffffffffffff811161018f57610e826112e06020923690600401610b5d565b612eba565b60608101514281111561140e575080516001600160a01b03169160408201519061133b61133483611327876001600160a01b03165f52600660205260405f2090565b905f5260205260405f2090565b5460ff1690565b6113d45761102e61135d9161135761135286611f1c565b611f95565b86612055565b61139f57829161139761138a60209361132761019e976001600160a01b03165f52600660205260405f2090565b805460ff19166001179055565b01519061229e565b7f3cd453ef000000000000000000000000000000000000000000000000000000005f526001600160a01b03831660045260245ffd5b7fa628820a000000000000000000000000000000000000000000000000000000005f526001600160a01b038416600452602482905260445ffd5b7f59a7ab2d000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b6040519061144c6020836102a1565b5f808352366020840137565b9061146282610882565b61146f60405191826102a1565b8281528092611480601f1991610882565b0190602036910137565b90600182811c921680156114b8575b60208310146114a457565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611499565b5f92918154916114d18361148a565b808352926001811690811561152657506001146114ed57505050565b5f9081526020812093945091925b83831061150c575060209250010190565b6001816020929493945483858701015201910191906114fb565b915050602093945060ff929192191683830152151560051b010190565b9061019e61155792604051938480926114c2565b03836102a1565b5190811515820361018f57565b9081602091031261018f576106ba9061155e565b6040513d5f823e3d90fd5b9190820391821161159757565b634e487b7160e01b5f52601160045260245ffd5b91905a906115b7612366565b60208401516001600160a01b0316308103611c8b5750604084015115611c63576115e084612eba565b6115f2815f52600460205260405f2090565b54611c3857610100850180515115611c105780515160208401515103611be8576002546001600160a01b031680611b06575b5061162e8661397d565b611a8a575b608086019586515195604085019687515103611a62575f5b885180518210156116b05761166282602092612b1b565b510151611670828a51612b1b565b5181811161168257505060010161164b565b7f8ffa61fa000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050856116d66116ca6116ca5f546001600160a01b031690565b6001600160a01b031690565b9360405163680038c760e01b8152602081600481895afa908115610e14575f91611a33575b5060c08501519060ff1680821115611a2b5750965b60e0850197885151908082106119fd57505061173a6113525f986117326102d3565b9081526139bc565b945f5b89518051821015611849576117558261175c92612b1b565b51886139fc565b986001600160a01b0381166001600160a01b038b16111561180e5750604051630616556760e41b81526001600160a01b038a16600482015289906020816024818d5afa908115610e14575f916117f0575b50156117bc575060010161173d565b7ff2470666000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b611808915060203d8111610e0d57610dff81836102a1565b8c6117ad565b7fce98854c000000000000000000000000000000000000000000000000000000005f526001600160a01b03908116600452891660245260445ffd5b5050866118638661185e611352338688612b2f565b6139fc565b604051630b1f76cf60e11b81526001600160a01b03821660048201529091602090829060249082905afa908115610e14575f916119de575b5015806119d7575b6119a35750436118c36118b583612eba565b5f52600460205260405f2090565b556118cf835151612ac0565b935f5b84515181101561190757806118eb87600193878761312e565b6118f58289612b1b565b526119008188612b1b565b50016118d2565b50611924610de2936119789361191d8282613391565b3391612b2f565b7f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e05f80a261197160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5a9061158a565b7fa523ba49000000000000000000000000000000000000000000000000000000005f52600452602490565b7f100158a8000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b505f6118a3565b6119f7915060203d602011610e0d57610dff81836102a1565b8661189b565b7fcd0ce699000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905096611710565b611a55915060203d602011611a5b575b611a4d81836102a1565b810190613119565b886116fb565b503d611a43565b7f9dca1448000000000000000000000000000000000000000000000000000000005f5260045ffd5b606086015142811115611ad75750825142811115611aa85750611633565b7f2c39717b000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b7f95d3dc22000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b95925f9592959491945b85518051821015611bd95781611b2591612b1b565b5190611b5d611b58611b4160208501516001600160a01b031690565b6001600160a01b03165f52600560205260405f2090565b611543565b918251611b70575b506001915001611b10565b611b826001600160a01b038b166116ca565b92833b1561018f57611bac935f92604051809681948293631001f1c560e21b8452600484016130f4565b03915afa918215610e145760019215611b655780611bcd5f611bd3936102a1565b806103f9565b5f611b65565b5050929550929390935f611624565b7f95784c9b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fe5dfb56a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f0413dc4a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f58e8d181000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30b078bf000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b60405190611cce6040836102a1565b600182527f31000000000000000000000000000000000000000000000000000000000000006020830152565b611d11611da892611d096134f9565b6112806134f9565b611d196134f9565b611d216134f9565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055611d8e604051611d566040826102a1565b601681527f4d696d69632050726f746f636f6c20536574746c6572000000000000000000006020820152611d88611cbf565b90612c81565b6001600160a01b03166001600160a01b03195f5416175f55565b6040516108e080820182811067ffffffffffffffff821117610264578291615204833903905ff0908115610e1457610eb26001600160a01b0361019e93166001600160a01b03166001600160a01b03196001541617600155565b6001600160a01b03168015611e91576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303611ef057565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b6001600160a01b03815116906020810151602081519101209060606040820151910151906040519260208401947f1d67bc34682cf5afae07788c838639fb56351f501a18353e3dd38b5f06c8166a865260408501526060840152608083015260a082015260a08152611f8f60c0826102a1565b51902090565b604290611fa0614a1e565b611fa8614a88565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152611ff960c0826102a1565b51902090604051917f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201522090565b634e487b7160e01b5f52602160045260245ffd5b6004111561205057565b612032565b9190916120628284612fe3565b5060048110156120505715908161210c575b50612104575f926120ae6120bc85946040519283916020830195630b135d3f60e11b875260248401526040604484015260648301906105eb565b03601f1981018352826102a1565b51915afa6120c861301d565b816120f6575b816120d7575090565b905060208180518101031261018f5760200151630b135d3f60e11b1490565b9050602081511015906120ce565b505050600190565b90506001600160a01b038083169116145f612074565b81811061212d575050565b5f8155600101612122565b90601f8211612145575050565b61019e917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f5260205f20906020601f840160051c83019310612190575b601f0160051c0190612122565b9091508190612183565b9190601f81116121a957505050565b61019e925f5260205f20906020601f840160051c8301931061219057601f0160051c0190612122565b919091825167ffffffffffffffff8111610264576121fa816121f4845461148a565b8461219a565b6020601f821160011461223957819061222a9394955f9261222e575b50508160011b915f199060031b1c19161790565b9055565b015190505f80612216565b601f1982169061224c845f5260205f2090565b915f5b8181106122865750958360019596971061226e575b505050811b019055565b01515f1960f88460031b161c191690555f8080612264565b9192602060018192868b01518155019401920161224f565b906122ec906122e76001600160a01b03841693845f52600560205260405f206122c7815461148a565b9081612312575b50506001600160a01b03165f52600560205260405f2090565b6121d2565b7f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f45f80a2565b81601f5f93116001146123295750555b5f806122ce565b8183526020832061234591601f0160051c810190600101612122565b808252602082209081548360011b9084198560031b1c191617905555612322565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054146123b55760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81036124605750814710612430575f8080936001600160a01b038294165af161242261301d565b901561242b5750565b613946565b50477fcf479181000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b0392909216602483015260448083019390935291815261019e916124b56064836102a1565b6138d9565b6040517fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10254815f6124ea8361148a565b808352926001811690811561258c575060011461250e575b6106ba925003826102a1565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b8183106125705750509060206106ba92820101612502565b6020919350806001915483858801015201910190918392612558565b602092506106ba94915060ff191682840152151560051b820101612502565b6040517fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354815f6125db8361148a565b808352926001811690811561258c57506001146125fe576106ba925003826102a1565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b8183106126605750509060206106ba92820101612502565b6020919350806001915483858801015201910190918392612648565b9290612686612366565b60208401516001600160a01b0316308103611c8b5750604084015115611c63576126af84612eba565b6126c1815f52600460205260405f2090565b54611c3857610100850180515115611c105780515160208401515103611be8576002546001600160a01b0316806129e4575b506126fd8661397d565b6129c6575b608086019586515195604085019687515103611a62575f5b885180518210156127515761273182602092612b1b565b51015161273f828a51612b1b565b5181811161168257505060010161271a565b5050929550929550926127716116ca6116ca5f546001600160a01b031690565b9360405163680038c760e01b8152602081600481895afa908115610e14575f916129a7575b5060c08501519060ff168082111561299f5750965b60e0850197885151908082106119fd5750506127cd6113525f986117326102d3565b945f5b8951805182101561286657611755826127e892612b1b565b986001600160a01b0381166001600160a01b038b16111561180e5750604051630616556760e41b81526001600160a01b038a16600482015289906020816024818d5afa908115610e14575f91612848575b50156117bc57506001016127d0565b612860915060203d8111610e0d57610dff81836102a1565b5f612839565b50509450949290955061288391965061185e611352338688612b2f565b604051630b1f76cf60e11b81526001600160a01b03821660048201529091602090829060249082905afa908115610e14575f91612980575b501580612978575b6119a35750436128d56118b583612eba565b556128e1835151612ac0565b935f5b84515181101561291957806128fd87600193878761312e565b6129078289612b1b565b526129128188612b1b565b50016128e4565b50935061292b925061191d8282613391565b7f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e05f80a261019e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5060016128c3565b612999915060203d602011610e0d57610dff81836102a1565b5f6128bb565b9050966127ab565b6129c0915060203d602011611a5b57611a4d81836102a1565b5f612796565b606086015142811115611ad75750825142811115611aa85750612702565b95925f9592959491945b85518051821015612a955781612a0391612b1b565b5190612a1f611b58611b4160208501516001600160a01b031690565b918251612a32575b5060019150016129ee565b612a446001600160a01b038b166116ca565b92833b1561018f57612a6e935f92604051809681948293631001f1c560e21b8452600484016130f4565b03915afa918215610e145760019215612a275780611bcd5f612a8f936102a1565b5f612a27565b5050929550929390935f6126f3565b5f5b828110612ab257505050565b606082820152602001612aa6565b9061019e612acd83610882565b612ada60405191826102a1565b83815260208194612aed601f1991610882565b019101612aa4565b634e487b7160e01b5f52603260045260245ffd5b805115612b165760200190565b612af5565b8051821015612b165760209160051b010190565b9190612b3a90612eba565b92825193602084015194612b4e8651611458565b935f5b8751811015612b805780612b676001928a612b1b565b5160208151910120612b798289612b1b565b5201612b51565b509194611f8f939650612bb260406120ae93968151612ba7816120ae602082018095613483565b5190209201516134b0565b9060405195869460208601988991926001600160a01b0360a094979695929760c08501987fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f86526020860152166040840152606083015260808201520152565b6001600160a01b03168015612c5957806001600160a01b031960035416176003557facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde105f80a2565b7f1793862f000000000000000000000000000000000000000000000000000000005f5260045ffd5b612c896134f9565b612c916134f9565b80519067ffffffffffffffff821161026457612cd682612cd17fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025461148a565b612138565b602090601f8311600114612d80579180612d0992612d3095945f9261222e5750508160011b915f199060031b1c19161790565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10255613550565b612d585f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10055565b61019e5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10155565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f52601f19831691907f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d925f5b818110612e2d5750916001939185612d3097969410612e15575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10255613550565b01515f1960f88460031b161c191690555f8080612de8565b92936020600181928786015181550195019301612dce565b9491926001600160a01b03610100979481612eb097949c9b9a9c7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea68a521660208901521660408701526060860152608085015260a084015261012060c08401526101208301906105eb565b9460e08201520152565b6001600160a01b038151166001600160a01b0360208301511692604083015191606084015192608085015195612ef08751611458565b945f5b8851811015612f915780896120ae612f7d6020612f2d85612f27612f1960019988612b1b565b51516001600160a01b031690565b95612b1b565b510151604051928391602083019586604090939291936001600160a01b0360608201957fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da483521660208201520152565b519020612f8a828a612b1b565b5201612ef3565b50909295611f8f9497506120ae9295604051612fb5816120ae602082018095613483565b51902060a082015190612fd161010060c08501519401516136c3565b93604051988997602089019b8c612e45565b81519190604183036130135761300c9250602082015190606060408401519301515f1a90613857565b9192909190565b50505f9160029190565b3d15613047573d9061302e826102e2565b9161303c60405193846102a1565b82523d5f602084013e565b606090565b60ff81511682526001600160a01b036020820151166020830152606061308160408301516080604086015260808501906105eb565b910151916060818303910152815180825260208201916020808360051b8301019401925f915b8383106130b657505050505090565b90919293946020806130e5600193601f198682030187526040838b5180518452015191818582015201906105eb565b970193019301919392906130a7565b909161310b6106ba9360408452604084019061304c565b9160208184039101526105eb565b9081602091031261018f57516106ba816109a2565b92919061314b61314383610100870151612b1b565b515160ff1690565b9360ff8516801580156131da575b6131cb57600181146131bc57600281146131ad576004146131a3577f3bb38fe2000000000000000000000000000000000000000000000000000000005f5260ff851660045260245ffd5b6106ba9450614749565b50909192506106ba935061428e565b50909192506106ba935061400c565b50909192506106ba9350613b91565b5060038114613159565b9291926131f082610882565b936131fe60405195866102a1565b606060208685815201930282019181831161018f57925b8284106132225750505050565b60608483031261018f57602060609160405161323d81610285565b86516132488161017e565b8152828701518382015260408701516132608161017e565b6040820152815201930192613215565b9080601f8301121561018f5781516106ba926020016131e4565b60208183031261018f5780519067ffffffffffffffff821161018f570160808183031261018f57604051916132be83610248565b8151835260208201516020840152604082015167ffffffffffffffff811161018f57820181601f8201121561018f5780516132f881610882565b9161330660405193846102a1565b81835260208084019260061b8201019084821161018f57602001915b818310613357575050506040840152606082015167ffffffffffffffff811161018f5761334f9201613270565b606082015290565b60408386031261018f576020604091825161337181610269565b855161337c8161017e565b81528286015183820152815201920191613322565b9190916101008101600360ff6133aa6131438451612b09565b1614613450575b50906133c482516001600160a01b031690565b906133e0826133db6001546001600160a01b031690565b6148db565b93610348915f5b608086015180518210156134465781613407612f19608094600194612b1b565b896001600160a01b0382168803613423575b50500190506133e7565b61343f916134358460408a0151612b1b565b51908a3391614948565b5f89613419565b5050945050505050565b604061345f6134719251612b09565b5101516020808251830101910161328a565b51461461347e575f6133b1565b509050565b80516020909101905f5b81811061349a5750505090565b825184526020938401939092019160010161348d565b6040516020810181819360208151939101925f5b8181106134e0575050611f8f925003601f1981018352826102a1565b84518352602094850194869450909201916001016134c4565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561352857565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b90815167ffffffffffffffff8111610264576135b6816135907fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035461148a565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10361219a565b602092601f8211600114613609576135e5929382915f9261222e5750508160011b915f199060031b1c19161790565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10355565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f52601f198216937f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75915f5b8681106136ab5750836001959610613693575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10355565b01515f1960f88460031b161c191690555f8080613669565b91926020600181928685015181550194019201613656565b6136cd8151611458565b905f5b8151811015613840576136e38183612b1b565b519060ff825116936001600160a01b03602084015116946060604085015160208151910120940151936137168551611458565b955f5b86518110156137a5578061372f60019289612b1b565b51516120ae6137916020613743858d612b1b565b510151602081519101206040519283916020830195866040909392919360608101947fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df825260208201520152565b51902061379e828b612b1b565b5201613719565b50979560019550966120ae613829929394986040516137cc816120ae602082018095613483565b519020604051948593602085019788909493926001600160a01b0360809360ff60a08501987fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3865216602085015216604083015260608201520152565b5190206138368286612b1b565b52019290926136d0565b5050604051611f8f816120ae602082018095613483565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116138ce579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610e14575f516001600160a01b038116156138c457905f905f90565b505f906001905f90565b5050505f9160039190565b905f602091828151910182855af11561157f575f513d61393d57506001600160a01b0381163b155b6139085750565b6001600160a01b03907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b60011415613901565b80511561395557805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101000151805115612b165760200151600360ff825116036139b65760406139b09101516020808251830101910161328a565b51461490565b50600190565b5160405160208101917f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e8352604082015260408152611f8f6060826102a1565b6106ba91613a0991612fe3565b90929192614acd565b81601f8201121561018f57805190613a29826102e2565b92613a3760405194856102a1565b8284526020838301011161018f57815f9260208093018386015e8301015290565b60208183031261018f5780519067ffffffffffffffff821161018f57019060608282031261018f5760405191613a8d83610285565b8051613a988161017e565b8352602081015167ffffffffffffffff811161018f5782613aba918301613a12565b602084015260408101519067ffffffffffffffff821161018f57019080601f8301121561018f578151613aec81610882565b92613afa60405194856102a1565b81845260208085019260051b82010192831161018f57602001905b828210613b2757505050604082015290565b8151815260209182019101613b15565b613b4d6106ba949260608352606083019061304c565b92602082015260408184039101526105eb565b60405190613b6f6020836102a1565b5f80835261019e9060208401612aa4565b9060206106ba92818152019061060f565b929190610100840191613ba5818451612b1b565b5191613bbe60408401516020808251830101910161328a565b956020820192613be2613bd2828651612b1b565b5160208082518301019101613a58565b95600360ff613bf2885160ff1690565b1603613f8b57600190515111613f6357613c0c8689614c06565b6001546001600160a01b0316613c376020870191613c3183516001600160a01b031690565b906148db565b9089514614613edc575b5050613c4c88614d0d565b93613c5683612eba565b613c7883613c716116ca6116ca8c516001600160a01b031690565b9351612b1b565b51823b1561018f57613cbe925f92838a604051968795869485937ffd93eba600000000000000000000000000000000000000000000000000000000855260048501613b37565b03925af18015610e1457613ec8575b506060880192613cde845151612ac0565b9860204691015114613cf4575b50505050505050565b613d078499989394979596975151611458565b9660405f9601955b8a518051821015613e7b5781613d2491612b1b565b51613d3f30613d3a83516001600160a01b031690565b614d72565b613d49838b612b1b565b5190818110613e485790613d5c9161158a565b613d66838c612b1b565b52613d72828951612b1b565b5180613d7e848d612b1b565b5110613e04575090613dc3828b613dbc84613db66040613da7600199516001600160a01b031690565b9501516001600160a01b031690565b92612b1b565b51916123dd565b6120ae613de8613dd3838d612b1b565b51604051928391602083019190602083019252565b613df2828d612b1b565b52613dfd818c612b1b565b5001613d0f565b610de29083613e13818e612b1b565b517ff0a43aa7000000000000000000000000000000000000000000000000000000005f52600491909152602452604452606490565b7ff5ad5ab7000000000000000000000000000000000000000000000000000000005f52600484905260245260445260645ffd5b505091945091969750613ea99450613eb7613e99613ebc9794612eba565b9360405196879160208301613b80565b03601f1981018752866102a1565b614e1c565b5f808080808080613ceb565b80611bcd5f613ed6936102a1565b5f613ccd565b969591949098935f989360408601995b8a518051821015613f4f5790613f498d8c613f0984600196612b1b565b518d6020613f40613f32613f2485516001600160a01b031690565b95516001600160a01b031690565b92516001600160a01b031690565b92015192614948565b01613eec565b505093985093985093909495505f80613c41565b7f376fce59000000000000000000000000000000000000000000000000000000005f5260045ffd5b50613f968689614b94565b613c0c565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f5760405191613fd083610269565b8051835260208101519067ffffffffffffffff821161018f57019080601f8301121561018f578151614004926020016131e4565b602082015290565b9092919261401f84610100840151612b1b565b5191614038604084015160208082518301019101613f9b565b9361405161404a876020860151612b1b565b5186614f3c565b6001546001600160a01b0316936140776020820195613c3187516001600160a01b031690565b9660205f9701965b875180518210156140d557906140cf8a61409b83600195612b1b565b5180516001600160a01b0316906140b98c516001600160a01b031690565b6020613f4060408401516001600160a01b031690565b0161407f565b50509296509290945061019e93506140f46140ee613b60565b96612eba565b906140fd61143d565b93614e1c565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f576040519161413883610269565b8051835260208101519067ffffffffffffffff821161018f570181601f8201121561018f5780519061416982610882565b9261417760405194856102a1565b82845260208085019360051b8301019181831161018f5760208101935b8385106141a8575050505050602082015290565b845167ffffffffffffffff811161018f5782016060818503601f19011261018f57604051916141d683610285565b60208201516141e48161017e565b835260408201519267ffffffffffffffff841161018f5760608361420f886020809881980101613a12565b8584015201516040820152815201940193614194565b9080602083519182815201916020808360051b8301019401925f915b83831061425057505050505090565b909192939460208061426e600193601f1986820301875289516105eb565b97019301930191939290614241565b9060206106ba928181520190614225565b9290926142a083610100830151612b1b565b51916142b9604084015160208082518301019101614103565b9260206142c98682890151612b1b565b51946142ea828401966142e388516001600160a01b031690565b9083614fee565b01946142f7865151612ac0565b965f5b8751805182101561436b579061434f61431582600194612b1b565b5183546001600160a01b0316906143338b516001600160a01b031690565b81516001600160a01b031690604060208401519301519361504c565b614359828c612b1b565b52614364818b612b1b565b50016142fa565b505091936143809193965061019e9550612eba565b9060405193613eb785613ea98a6020830161427d565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f57604051916143cb83610269565b8051835260208101519067ffffffffffffffff821161018f57019080601f8301121561018f5781516143fc81610882565b9261440a60405194856102a1565b81845260208085019260051b8201019183831161018f5760208201905b83821061443b575050505050602082015290565b815167ffffffffffffffff811161018f5760209161445e87848094880101613a12565b815201910190614427565b60208183031261018f5780519067ffffffffffffffff821161018f57019060808282031261018f576040519161449e83610248565b80516144a98161017e565b83526020810151602084015260408101517fffffffff000000000000000000000000000000000000000000000000000000008116810361018f57604084015260608101519067ffffffffffffffff821161018f57019080601f8301121561018f5781519161451683610882565b9261452460405194856102a1565b80845260208085019160051b8301019183831161018f5760208101915b838310614555575050505050606082015290565b825167ffffffffffffffff811161018f578201906060828703601f19011261018f576040519061458482610285565b6020830151600281101561018f57825260408301519167ffffffffffffffff831161018f576145cb6060856145c18b602080999881990101613a12565b868501520161155e565b6040820152815201920191614541565b9060208282031261018f57815167ffffffffffffffff811161018f576106ba9201613a12565b9080602083519182815201916020808360051b8301019401925f915b83831061462c57505050505090565b909192939460208061464a600193601f198682030187528951614225565b9701930193019193929061461d565b93929160608552606060e08601926001600160a01b0381511682880152602081015160808801527fffffffff0000000000000000000000000000000000000000000000000000000060408201511660a0880152015191608060c08701528251809152610100860160206101008360051b8901019401915f5b8181106146f55750505050816146f09186604094036020880152614601565b930152565b9091929460ff19898203018452855190815160028110156120505760019282602093928493526040806147358585015160608786015260608501906105eb565b9301511515910152970194019291016146d1565b929161475a81610100860151612b1b565b5193614773604086015160208082518301019101614396565b9560206147838482870151612b1b565b519761479d828901996142e38b516001600160a01b031690565b01956147aa875151612ac0565b945f5b885180518210156148c457906147d96147c98261482a94612b1b565b5160208082518301019101614469565b5f886147f36116ca6116ca6003546001600160a01b031690565b8c6040518097819482937ff964081d0000000000000000000000000000000000000000000000000000000084528860048501614659565b03915afa928315610e1457600193614884928e925f926148a0575b5061486861485a87546001600160a01b031690565b93516001600160a01b031690565b602061487b83516001600160a01b031690565b9201519361504c565b61488e828a612b1b565b526148998189612b1b565b50016147ad565b6148bd9192503d805f833e6148b581836102a1565b8101906145db565b905f614845565b5050929094975061438091965061019e9550612eba565b906001600160a01b0360246020928260405195869485937f5e07a6e6000000000000000000000000000000000000000000000000000000008552166004840152165afa908115610e14575f9161492f575090565b6106ba915060203d602011610e0d57610dff81836102a1565b9193909290156149be576001600160a01b036149bb948180600154169481604051977ff18d03cc0000000000000000000000000000000000000000000000000000000060208a01521660248801521660448601521660648401526084830152608482526149b660a4836102a1565b615191565b50565b906001600160a01b03918261019e9581604051967f23b872dd000000000000000000000000000000000000000000000000000000006020890152166024870152166044850152606484015260648352614a186084846102a1565b166138d9565b614a266124ba565b8051908115614a36576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100548015614a635790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b614a906125ab565b8051908115614aa0576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101548015614a635790565b614ad681612046565b80614adf575050565b614ae881612046565b60018103614b18577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b614b2181612046565b60028103614b5557507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b80614b61600392612046565b14614b695750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b908151602083015103614bde5781514603614bb25761019e916150c5565b7f611487ba000000000000000000000000000000000000000000000000000000005f524660045260245ffd5b7f3bc78edf000000000000000000000000000000000000000000000000000000005f5260045ffd5b80516020820190815114614bde5781514614159081614d01575b50614bb25781614c2f916150c5565b614c926020614c4b6116ca6116ca5f546001600160a01b031690565b83516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015292839190829081906024820190565b03915afa908115610e14575f91614ce2575b5015614cad5750565b517fdb489af4000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b614cfb915060203d602011610e0d57610dff81836102a1565b5f614ca4565b5146141590505f614c20565b90606082016020614d1f825151611458565b9301514614614d2b5750565b905f5b82518051821015614d6c5790614d5b6001926001600160a01b03614d53843093612b1b565b515116614d72565b614d658287612b1b565b5201614d2e565b50509050565b6001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8103614d9b57503190565b906001600160a01b03602460209260405194859384927f70a082310000000000000000000000000000000000000000000000000000000084521660048301525afa908115610e14575f91614ded575090565b90506020813d602011614e14575b81614e08602093836102a1565b8101031261018f575190565b3d9150614dfb565b93909291935f5b60608201518051821015613ceb5781614e3b91612b1b565b516001600160a01b03602084015116815190602060ff8651169301516040519060c08252614e6c60c083018861304c565b82810360208401528a518152898c8c6040614e966020830151606060208801526060870190614225565b910151936040818303910152602080855192838152019401905f905b808210614f1e575050507fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d393614f0786948594614f1594604060019e9d9c9b9a0152606086015284810360808601528d6105eb565b9083820360a08501526105eb565b0390a401614e23565b9250925092602080600192865181520194019201918c928f92614eb2565b919082514603614bb25751614fc6575f5b60208301518051821015614d6c576040614f6a83614f7993612b1b565b5101516001600160a01b031690565b306001600160a01b03821614614f925750600101614f4d565b7f0b9ab599000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b7f93c58e11000000000000000000000000000000000000000000000000000000005f5260045ffd5b514603614bb25751614fc65761500f816001600160a01b03600154166148db565b156150175750565b6001600160a01b03907fcaec9bac000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b906149b6906040956150ad6150c1966001600160a01b0380978a519889967fff883fcf0000000000000000000000000000000000000000000000000000000060208901521660248701521660448501526080606485015260a48401906105eb565b90608483015203601f1981018452836102a1565b0190565b919060400190606082515193019283515103615169575f5b8351805182101561516257816150f291612b1b565b5160408101516001600160a01b0316308114614f92575060200151615118828551612b1b565b5181811061512a5750506001016150dd565b610de2927f1fef5f33000000000000000000000000000000000000000000000000000000005f52929190606493600452602452604452565b5050915050565b7f1816c202000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f806106ba93602081519101845af46151a861301d565b91906151b45750613946565b815115806151fa575b6151c5575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156151bd56fe608080604052346015576108c6908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80635e07a6e614610126578063f18d03cc146100e25763ff883fcf1461003a575f80fd5b346100de5760803660031901126100de57610053610153565b61005b610169565b906044359067ffffffffffffffff82116100de57366023830112156100de57816004013592610089846101ce565b90610097604051928361017f565b84825236602486860101116100de575f6020866100da9760246100c698018387013784010152606435926103ea565b6040519182916020835260208301906101ea565b0390f35b5f80fd5b346100de5760803660031901126100de576100fb610153565b610103610169565b906044356001600160a01b03811681036100de576101249260643592610243565b005b346100de5760203660031901126100de576020610149610144610153565b61020e565b6040519015158152f35b600435906001600160a01b03821682036100de57565b602435906001600160a01b03821682036100de57565b90601f8019910116810190811067ffffffffffffffff8211176101a157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116101a157601f01601f191660200190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b803b1561023e5761021e8161066d565b6102385761022b906104d8565b610233575f90565b600190565b50600190565b505f90565b929061024e8461066d565b6103205761025b846104d8565b61027b576001600160a01b0384636b94637360e11b5f521660045260245ffd5b919290916001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee036102c957506102c692604051916102b760208461017f565b5f808452366020850137610626565b50565b906102c693926001600160a01b03604051947fa9059cbb00000000000000000000000000000000000000000000000000000000602087015216602485015260448401526044835261031b60648461017f565b61055a565b91926001600160a01b0316803b156100de575f92836064926001600160a01b03948560405198899788967fbeabacc800000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401525af180156103995761038d5750565b5f6103979161017f565b565b6040513d5f823e3d90fd5b81601f820112156100de578051906103bb826101ce565b926103c9604051948561017f565b828452602083830101116100de57815f9260208093018386015e8301015290565b9291906103f68461066d565b61042f57610403846104d8565b610423576001600160a01b0384636b94637360e11b5f521660045260245ffd5b61042c93610626565b90565b926001600160a01b035f81610484968296604051988997889687947f4ae000410000000000000000000000000000000000000000000000000000000086521660048501526060602485015260648401906101ea565b9060448301520393165af1908115610399575f916104a0575090565b90503d805f833e6104b1818361017f565b81016020828203126100de57815167ffffffffffffffff81116100de5761042c92016103a4565b5f809160405160208101907fe75235b80000000000000000000000000000000000000000000000000000000082526004815261051560248261017f565b51915afa3d15610553573d610529816101ce565b90610537604051928361017f565b81523d5f602083013e5b8161054a575090565b60209150511490565b6060610541565b9190915f6040518092635229073f60e01b82526001600160a01b03861660048301528260248301526080604483015281836001600160a01b03826105a1608482018a6101ea565b8360648301520393165af1918215610399575f915f936105d5575b50516105cc5761042c9250610850565b61042c926107f6565b915091503d805f833e6105e8818361017f565b8101906040818303126100de5780519182151583036100de57602082015167ffffffffffffffff81116100de5761061f92016103a4565b915f6105bc565b90925f90604051928391635229073f60e01b83526001600160a01b038716600484015260248301526080604483015281836001600160a01b03826105a1608482018a6101ea565b60205f604051828101906301ffc9a760e01b82526301ffc9a760e01b60248201526024815261069d60448261017f565b519084617530fa903d5f5190836107ea575b50826107e0575b5081610760575b816106c6575090565b602091505f90604051838101906301ffc9a760e01b82527fffffffff000000000000000000000000000000000000000000000000000000007ff44bac89000000000000000000000000000000000000000000000000000000001660248201526024815261073460448261017f565b5191617530fa5f513d82610754575b508161074d575090565b9050151590565b6020111591505f610743565b905060205f604051828101906301ffc9a760e01b82527fffffffff000000000000000000000000000000000000000000000000000000006024820152602481526107ab60448261017f565b519084617530fa5f513d826107d4575b50816107ca575b5015906106bd565b905015155f6107c2565b6020111591505f6107bb565b151591505f6106b6565b6020111592505f6106af565b906108015750610859565b81511580610847575b610812575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b1561080a565b90919061039757505b80511561086857805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea264697066735822122073412de79f18d64fa84e8572f6b96024e534a9585bb249a06156504b82479b5264736f6c634300081c0033a2646970667358221220937e34b078f06ebb3fb78c25a74edf7a3b2ffe7b5b8b6d57866a3475eab0c92664736f6c634300081c0033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00",
+ "deployedBytecode": "0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80630fc27cf614610179578063403b5659146101745780634987ed2f1461016f57806355ef9b861461016a5780636ccae05414610165578063715018a61461016057806384b0196e1461015b57806384d44e28146101565780638da5cb5b14610151578063911929df1461014c5780639479591614610147578063950026511461014257806396d45f511461013d5780639c2a2c6e146101385780639f86fded14610133578063a49eacff1461012e578063c0c53b8b14610129578063cbc9104514610124578063e5814ea61461011f578063f2fde38b1461011a578063f77c4791146101155763faa390d70361000e576112aa565b611285565b611258565b611232565b6111f8565b610fbb565b610f55565b610edd565b610eb7565b610e8a565b610e19565b610d68565b610821565b6107dc565b6107b2565b6106bd565b610554565b610478565b610429565b610403565b610344565b6101a0565b6001600160a01b0381160361018f57565b5f80fd5b359061019e8261017e565b565b3461018f57602036600319011261018f576001600160a01b036004356101c58161017e565b6101cd611ebd565b16801561020c57806001600160a01b031960015416176001557f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e6545f80a2005b7f42af048a000000000000000000000000000000000000000000000000000000005f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6080810190811067ffffffffffffffff82111761026457604052565b610234565b6040810190811067ffffffffffffffff82111761026457604052565b6060810190811067ffffffffffffffff82111761026457604052565b90601f8019910116810190811067ffffffffffffffff82111761026457604052565b6040519061019e610120836102a1565b6040519061019e6020836102a1565b67ffffffffffffffff811161026457601f01601f191660200190565b81601f8201121561018f57803590610315826102e2565b9261032360405194856102a1565b8284526020838301011161018f57815f926020809301838601378301015290565b3461018f57604036600319011261018f5760043567ffffffffffffffff811161018f576080600319823603011261018f576040519061038282610248565b80600401356103908161017e565b825260248101359067ffffffffffffffff821161018f576103b9606492600436918401016102fe565b602084015260448101356040840152013560608201526024359067ffffffffffffffff821161018f576103f36100189236906004016102fe565b906112e5565b5f91031261018f57565b3461018f575f36600319011261018f5760206001600160a01b0360015416604051908152f35b3461018f57604036600319011261018f576004356104468161017e565b6001600160a01b0360243591165f52600660205260405f20905f52602052602060ff60405f2054166040519015158152f35b3461018f57606036600319011261018f576004356104958161017e565b6024356104a18161017e565b604435906104ad611ebd565b6104b5612366565b6001600160a01b03811692831561052c576001600160a01b03816104fd857fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805956020956123dd565b6040519485521692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b7f54328a09000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461018f575f36600319011261018f5761056c611ebd565b5f6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90602080835192838152019201905f5b81811061062c5750505090565b825184526020938401939092019160010161061f565b919361069b6106ba96949561068d6001600160a01b03947f0f00000000000000000000000000000000000000000000000000000000000000875260e0602088015260e08701906105eb565b9085820360408701526105eb565b9460608401521660808201525f60a082015260c081840391015261060f565b90565b3461018f575f36600319011261018f577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610789575b1561072b576107036124ba565b61070b6125ab565b9061072761071761143d565b6040519384933091469186610642565b0390f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10154156106f6565b3461018f57602036600319011261018f576004355f526004602052602060405f2054604051908152f35b3461018f575f36600319011261018f5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461018f57602036600319011261018f576001600160a01b036004356108468161017e565b165f52600560205261072761086761086e60405f20604051928380926114c2565b03826102a1565b6040519182916020835260208301906105eb565b67ffffffffffffffff81116102645760051b60200190565b81601f8201121561018f578035906108b182610882565b926108bf60405194856102a1565b82845260208085019360061b8301019181831161018f57602001925b8284106108e9575050505090565b60408483031261018f576020604091825161090381610269565b863561090e8161017e565b815282870135838201528152019301926108db565b9080601f8301121561018f57813561093a81610882565b9261094860405194856102a1565b81845260208085019260051b8201019183831161018f5760208201905b83821061097457505050505090565b813567ffffffffffffffff811161018f57602091610997878480948801016102fe565b815201910190610965565b60ff81160361018f57565b9080601f8301121561018f578135916109c583610882565b926109d360405194856102a1565b80845260208085019160051b8301019183831161018f5760208101915b8383106109ff57505050505090565b823567ffffffffffffffff811161018f5782016080818703601f19011261018f5760405190610a2d82610248565b6020810135610a3b816109a2565b82526040810135610a4b8161017e565b6020830152606081013567ffffffffffffffff811161018f57876020610a73928401016102fe565b6040830152608081013567ffffffffffffffff811161018f57602091010186601f8201121561018f57803590610aa882610882565b91610ab660405193846102a1565b80835260208084019160051b8301019189831161018f5760208101915b838310610af1575050505060608201528152602092830192016109f0565b823567ffffffffffffffff811161018f578201906040828d03601f19011261018f5760405190610b2082610269565b6020830135825260408301359167ffffffffffffffff831161018f57610b4e8e6020809695819601016102fe565b83820152815201920191610ad3565b9190916101208184031261018f57610b736102c3565b92610b7d82610193565b8452610b8b60208301610193565b60208501526040820135604085015260608201356060850152608082013567ffffffffffffffff811161018f5781610bc491840161089a565b608085015260a082013567ffffffffffffffff811161018f5781610be99184016102fe565b60a085015260c082013560c085015260e082013567ffffffffffffffff811161018f5781610c18918401610923565b60e085015261010082013567ffffffffffffffff811161018f57610c3c92016109ad565b610100830152565b919060608382031261018f57604051610c5c81610285565b809380358252602081013567ffffffffffffffff811161018f5783610c82918301610923565b602083015260408101359067ffffffffffffffff821161018f57019180601f8401121561018f578235610cb481610882565b93610cc260405195866102a1565b81855260208086019260051b82010192831161018f57602001905b828210610ced5750505060400152565b8135815260209182019101610cdd565b606060031982011261018f5760043567ffffffffffffffff811161018f5781610d2891600401610b5d565b9160243567ffffffffffffffff811161018f5782610d4891600401610c44565b916044359067ffffffffffffffff821161018f576106ba916004016102fe565b3461018f57610d7636610cfd565b5f5460405163d9d8edb960e01b815233600482015291939190602090829060249082906001600160a01b03165afa908115610e14575f91610de5575b506115ab575b7fa7ac57a9000000000000000000000000000000000000000000000000000000005f523360045260245b5ffd5b610e07915060203d602011610e0d575b610dff81836102a1565b81019061156b565b5f610db2565b503d610df5565b61157f565b3461018f57606036600319011261018f5760043567ffffffffffffffff811161018f57610e4a903690600401610c44565b60243567ffffffffffffffff811161018f57602091610e70610e82923690600401610b5d565b60443591610e7d8361017e565b612b2f565b604051908152f35b3461018f57602036600319011261018f57610018600435610eaa8161017e565b610eb2611ebd565b612c12565b3461018f575f36600319011261018f5760206001600160a01b0360035416604051908152f35b3461018f57610eeb36610cfd565b5f5460405163d9d8edb960e01b815233600482015291929190602090829060249082906001600160a01b03165afa908115610e14575f91610f36575b5015610db8576100189261267c565b610f4f915060203d602011610e0d57610dff81836102a1565b5f610f27565b3461018f57602036600319011261018f576001600160a01b03600435610f7a8161017e565b610f82611ebd565b16806001600160a01b031960025416176002557f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef75f80a2005b3461018f57606036600319011261018f57600435610fd88161017e565b60243590610fe58261017e565b604435610ff18161017e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549267ffffffffffffffff61104060ff604087901c1615611032565b1590565b9567ffffffffffffffff1690565b16801590816111f0575b60011490816111e6575b1590816111dd575b506111b5576110c692846110bd600167ffffffffffffffff197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b61115057611cfa565b6110cc57005b61112168ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6111b06801000000000000000068ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b611cfa565b7ff92ee8a9000000000000000000000000000000000000000000000000000000005f5260045ffd5b9050155f61105c565b303b159150611054565b85915061104a565b3461018f57602036600319011261018f5760043567ffffffffffffffff811161018f5761122c6100189136906004016102fe565b3361229e565b3461018f575f36600319011261018f5760206001600160a01b0360025416604051908152f35b3461018f57602036600319011261018f576100186004356112788161017e565b611280611ebd565b611e02565b3461018f575f36600319011261018f5760206001600160a01b035f5416604051908152f35b3461018f57602036600319011261018f5760043567ffffffffffffffff811161018f57610e826112e06020923690600401610b5d565b612eba565b60608101514281111561140e575080516001600160a01b03169160408201519061133b61133483611327876001600160a01b03165f52600660205260405f2090565b905f5260205260405f2090565b5460ff1690565b6113d45761102e61135d9161135761135286611f1c565b611f95565b86612055565b61139f57829161139761138a60209361132761019e976001600160a01b03165f52600660205260405f2090565b805460ff19166001179055565b01519061229e565b7f3cd453ef000000000000000000000000000000000000000000000000000000005f526001600160a01b03831660045260245ffd5b7fa628820a000000000000000000000000000000000000000000000000000000005f526001600160a01b038416600452602482905260445ffd5b7f59a7ab2d000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b6040519061144c6020836102a1565b5f808352366020840137565b9061146282610882565b61146f60405191826102a1565b8281528092611480601f1991610882565b0190602036910137565b90600182811c921680156114b8575b60208310146114a457565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611499565b5f92918154916114d18361148a565b808352926001811690811561152657506001146114ed57505050565b5f9081526020812093945091925b83831061150c575060209250010190565b6001816020929493945483858701015201910191906114fb565b915050602093945060ff929192191683830152151560051b010190565b9061019e61155792604051938480926114c2565b03836102a1565b5190811515820361018f57565b9081602091031261018f576106ba9061155e565b6040513d5f823e3d90fd5b9190820391821161159757565b634e487b7160e01b5f52601160045260245ffd5b91905a906115b7612366565b60208401516001600160a01b0316308103611c8b5750604084015115611c63576115e084612eba565b6115f2815f52600460205260405f2090565b54611c3857610100850180515115611c105780515160208401515103611be8576002546001600160a01b031680611b06575b5061162e8661397d565b611a8a575b608086019586515195604085019687515103611a62575f5b885180518210156116b05761166282602092612b1b565b510151611670828a51612b1b565b5181811161168257505060010161164b565b7f8ffa61fa000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050856116d66116ca6116ca5f546001600160a01b031690565b6001600160a01b031690565b9360405163680038c760e01b8152602081600481895afa908115610e14575f91611a33575b5060c08501519060ff1680821115611a2b5750965b60e0850197885151908082106119fd57505061173a6113525f986117326102d3565b9081526139bc565b945f5b89518051821015611849576117558261175c92612b1b565b51886139fc565b986001600160a01b0381166001600160a01b038b16111561180e5750604051630616556760e41b81526001600160a01b038a16600482015289906020816024818d5afa908115610e14575f916117f0575b50156117bc575060010161173d565b7ff2470666000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b611808915060203d8111610e0d57610dff81836102a1565b8c6117ad565b7fce98854c000000000000000000000000000000000000000000000000000000005f526001600160a01b03908116600452891660245260445ffd5b5050866118638661185e611352338688612b2f565b6139fc565b604051630b1f76cf60e11b81526001600160a01b03821660048201529091602090829060249082905afa908115610e14575f916119de575b5015806119d7575b6119a35750436118c36118b583612eba565b5f52600460205260405f2090565b556118cf835151612ac0565b935f5b84515181101561190757806118eb87600193878761312e565b6118f58289612b1b565b526119008188612b1b565b50016118d2565b50611924610de2936119789361191d8282613391565b3391612b2f565b7f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e05f80a261197160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5a9061158a565b7fa523ba49000000000000000000000000000000000000000000000000000000005f52600452602490565b7f100158a8000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b505f6118a3565b6119f7915060203d602011610e0d57610dff81836102a1565b8661189b565b7fcd0ce699000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905096611710565b611a55915060203d602011611a5b575b611a4d81836102a1565b810190613119565b886116fb565b503d611a43565b7f9dca1448000000000000000000000000000000000000000000000000000000005f5260045ffd5b606086015142811115611ad75750825142811115611aa85750611633565b7f2c39717b000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b7f95d3dc22000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b95925f9592959491945b85518051821015611bd95781611b2591612b1b565b5190611b5d611b58611b4160208501516001600160a01b031690565b6001600160a01b03165f52600560205260405f2090565b611543565b918251611b70575b506001915001611b10565b611b826001600160a01b038b166116ca565b92833b1561018f57611bac935f92604051809681948293631001f1c560e21b8452600484016130f4565b03915afa918215610e145760019215611b655780611bcd5f611bd3936102a1565b806103f9565b5f611b65565b5050929550929390935f611624565b7f95784c9b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fe5dfb56a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f0413dc4a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f58e8d181000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30b078bf000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b60405190611cce6040836102a1565b600182527f31000000000000000000000000000000000000000000000000000000000000006020830152565b611d11611da892611d096134f9565b6112806134f9565b611d196134f9565b611d216134f9565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055611d8e604051611d566040826102a1565b601681527f4d696d69632050726f746f636f6c20536574746c6572000000000000000000006020820152611d88611cbf565b90612c81565b6001600160a01b03166001600160a01b03195f5416175f55565b6040516108e080820182811067ffffffffffffffff821117610264578291615204833903905ff0908115610e1457610eb26001600160a01b0361019e93166001600160a01b03166001600160a01b03196001541617600155565b6001600160a01b03168015611e91576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303611ef057565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b6001600160a01b03815116906020810151602081519101209060606040820151910151906040519260208401947f1d67bc34682cf5afae07788c838639fb56351f501a18353e3dd38b5f06c8166a865260408501526060840152608083015260a082015260a08152611f8f60c0826102a1565b51902090565b604290611fa0614a1e565b611fa8614a88565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152611ff960c0826102a1565b51902090604051917f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201522090565b634e487b7160e01b5f52602160045260245ffd5b6004111561205057565b612032565b9190916120628284612fe3565b5060048110156120505715908161210c575b50612104575f926120ae6120bc85946040519283916020830195630b135d3f60e11b875260248401526040604484015260648301906105eb565b03601f1981018352826102a1565b51915afa6120c861301d565b816120f6575b816120d7575090565b905060208180518101031261018f5760200151630b135d3f60e11b1490565b9050602081511015906120ce565b505050600190565b90506001600160a01b038083169116145f612074565b81811061212d575050565b5f8155600101612122565b90601f8211612145575050565b61019e917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f5260205f20906020601f840160051c83019310612190575b601f0160051c0190612122565b9091508190612183565b9190601f81116121a957505050565b61019e925f5260205f20906020601f840160051c8301931061219057601f0160051c0190612122565b919091825167ffffffffffffffff8111610264576121fa816121f4845461148a565b8461219a565b6020601f821160011461223957819061222a9394955f9261222e575b50508160011b915f199060031b1c19161790565b9055565b015190505f80612216565b601f1982169061224c845f5260205f2090565b915f5b8181106122865750958360019596971061226e575b505050811b019055565b01515f1960f88460031b161c191690555f8080612264565b9192602060018192868b01518155019401920161224f565b906122ec906122e76001600160a01b03841693845f52600560205260405f206122c7815461148a565b9081612312575b50506001600160a01b03165f52600560205260405f2090565b6121d2565b7f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f45f80a2565b81601f5f93116001146123295750555b5f806122ce565b8183526020832061234591601f0160051c810190600101612122565b808252602082209081548360011b9084198560031b1c191617905555612322565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054146123b55760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81036124605750814710612430575f8080936001600160a01b038294165af161242261301d565b901561242b5750565b613946565b50477fcf479181000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b0392909216602483015260448083019390935291815261019e916124b56064836102a1565b6138d9565b6040517fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10254815f6124ea8361148a565b808352926001811690811561258c575060011461250e575b6106ba925003826102a1565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b8183106125705750509060206106ba92820101612502565b6020919350806001915483858801015201910190918392612558565b602092506106ba94915060ff191682840152151560051b820101612502565b6040517fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354815f6125db8361148a565b808352926001811690811561258c57506001146125fe576106ba925003826102a1565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b8183106126605750509060206106ba92820101612502565b6020919350806001915483858801015201910190918392612648565b9290612686612366565b60208401516001600160a01b0316308103611c8b5750604084015115611c63576126af84612eba565b6126c1815f52600460205260405f2090565b54611c3857610100850180515115611c105780515160208401515103611be8576002546001600160a01b0316806129e4575b506126fd8661397d565b6129c6575b608086019586515195604085019687515103611a62575f5b885180518210156127515761273182602092612b1b565b51015161273f828a51612b1b565b5181811161168257505060010161271a565b5050929550929550926127716116ca6116ca5f546001600160a01b031690565b9360405163680038c760e01b8152602081600481895afa908115610e14575f916129a7575b5060c08501519060ff168082111561299f5750965b60e0850197885151908082106119fd5750506127cd6113525f986117326102d3565b945f5b8951805182101561286657611755826127e892612b1b565b986001600160a01b0381166001600160a01b038b16111561180e5750604051630616556760e41b81526001600160a01b038a16600482015289906020816024818d5afa908115610e14575f91612848575b50156117bc57506001016127d0565b612860915060203d8111610e0d57610dff81836102a1565b5f612839565b50509450949290955061288391965061185e611352338688612b2f565b604051630b1f76cf60e11b81526001600160a01b03821660048201529091602090829060249082905afa908115610e14575f91612980575b501580612978575b6119a35750436128d56118b583612eba565b556128e1835151612ac0565b935f5b84515181101561291957806128fd87600193878761312e565b6129078289612b1b565b526129128188612b1b565b50016128e4565b50935061292b925061191d8282613391565b7f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e05f80a261019e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5060016128c3565b612999915060203d602011610e0d57610dff81836102a1565b5f6128bb565b9050966127ab565b6129c0915060203d602011611a5b57611a4d81836102a1565b5f612796565b606086015142811115611ad75750825142811115611aa85750612702565b95925f9592959491945b85518051821015612a955781612a0391612b1b565b5190612a1f611b58611b4160208501516001600160a01b031690565b918251612a32575b5060019150016129ee565b612a446001600160a01b038b166116ca565b92833b1561018f57612a6e935f92604051809681948293631001f1c560e21b8452600484016130f4565b03915afa918215610e145760019215612a275780611bcd5f612a8f936102a1565b5f612a27565b5050929550929390935f6126f3565b5f5b828110612ab257505050565b606082820152602001612aa6565b9061019e612acd83610882565b612ada60405191826102a1565b83815260208194612aed601f1991610882565b019101612aa4565b634e487b7160e01b5f52603260045260245ffd5b805115612b165760200190565b612af5565b8051821015612b165760209160051b010190565b9190612b3a90612eba565b92825193602084015194612b4e8651611458565b935f5b8751811015612b805780612b676001928a612b1b565b5160208151910120612b798289612b1b565b5201612b51565b509194611f8f939650612bb260406120ae93968151612ba7816120ae602082018095613483565b5190209201516134b0565b9060405195869460208601988991926001600160a01b0360a094979695929760c08501987fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f86526020860152166040840152606083015260808201520152565b6001600160a01b03168015612c5957806001600160a01b031960035416176003557facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde105f80a2565b7f1793862f000000000000000000000000000000000000000000000000000000005f5260045ffd5b612c896134f9565b612c916134f9565b80519067ffffffffffffffff821161026457612cd682612cd17fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025461148a565b612138565b602090601f8311600114612d80579180612d0992612d3095945f9261222e5750508160011b915f199060031b1c19161790565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10255613550565b612d585f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10055565b61019e5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10155565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f52601f19831691907f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d925f5b818110612e2d5750916001939185612d3097969410612e15575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10255613550565b01515f1960f88460031b161c191690555f8080612de8565b92936020600181928786015181550195019301612dce565b9491926001600160a01b03610100979481612eb097949c9b9a9c7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea68a521660208901521660408701526060860152608085015260a084015261012060c08401526101208301906105eb565b9460e08201520152565b6001600160a01b038151166001600160a01b0360208301511692604083015191606084015192608085015195612ef08751611458565b945f5b8851811015612f915780896120ae612f7d6020612f2d85612f27612f1960019988612b1b565b51516001600160a01b031690565b95612b1b565b510151604051928391602083019586604090939291936001600160a01b0360608201957fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da483521660208201520152565b519020612f8a828a612b1b565b5201612ef3565b50909295611f8f9497506120ae9295604051612fb5816120ae602082018095613483565b51902060a082015190612fd161010060c08501519401516136c3565b93604051988997602089019b8c612e45565b81519190604183036130135761300c9250602082015190606060408401519301515f1a90613857565b9192909190565b50505f9160029190565b3d15613047573d9061302e826102e2565b9161303c60405193846102a1565b82523d5f602084013e565b606090565b60ff81511682526001600160a01b036020820151166020830152606061308160408301516080604086015260808501906105eb565b910151916060818303910152815180825260208201916020808360051b8301019401925f915b8383106130b657505050505090565b90919293946020806130e5600193601f198682030187526040838b5180518452015191818582015201906105eb565b970193019301919392906130a7565b909161310b6106ba9360408452604084019061304c565b9160208184039101526105eb565b9081602091031261018f57516106ba816109a2565b92919061314b61314383610100870151612b1b565b515160ff1690565b9360ff8516801580156131da575b6131cb57600181146131bc57600281146131ad576004146131a3577f3bb38fe2000000000000000000000000000000000000000000000000000000005f5260ff851660045260245ffd5b6106ba9450614749565b50909192506106ba935061428e565b50909192506106ba935061400c565b50909192506106ba9350613b91565b5060038114613159565b9291926131f082610882565b936131fe60405195866102a1565b606060208685815201930282019181831161018f57925b8284106132225750505050565b60608483031261018f57602060609160405161323d81610285565b86516132488161017e565b8152828701518382015260408701516132608161017e565b6040820152815201930192613215565b9080601f8301121561018f5781516106ba926020016131e4565b60208183031261018f5780519067ffffffffffffffff821161018f570160808183031261018f57604051916132be83610248565b8151835260208201516020840152604082015167ffffffffffffffff811161018f57820181601f8201121561018f5780516132f881610882565b9161330660405193846102a1565b81835260208084019260061b8201019084821161018f57602001915b818310613357575050506040840152606082015167ffffffffffffffff811161018f5761334f9201613270565b606082015290565b60408386031261018f576020604091825161337181610269565b855161337c8161017e565b81528286015183820152815201920191613322565b9190916101008101600360ff6133aa6131438451612b09565b1614613450575b50906133c482516001600160a01b031690565b906133e0826133db6001546001600160a01b031690565b6148db565b93610348915f5b608086015180518210156134465781613407612f19608094600194612b1b565b896001600160a01b0382168803613423575b50500190506133e7565b61343f916134358460408a0151612b1b565b51908a3391614948565b5f89613419565b5050945050505050565b604061345f6134719251612b09565b5101516020808251830101910161328a565b51461461347e575f6133b1565b509050565b80516020909101905f5b81811061349a5750505090565b825184526020938401939092019160010161348d565b6040516020810181819360208151939101925f5b8181106134e0575050611f8f925003601f1981018352826102a1565b84518352602094850194869450909201916001016134c4565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561352857565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b90815167ffffffffffffffff8111610264576135b6816135907fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035461148a565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10361219a565b602092601f8211600114613609576135e5929382915f9261222e5750508160011b915f199060031b1c19161790565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10355565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f52601f198216937f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75915f5b8681106136ab5750836001959610613693575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10355565b01515f1960f88460031b161c191690555f8080613669565b91926020600181928685015181550194019201613656565b6136cd8151611458565b905f5b8151811015613840576136e38183612b1b565b519060ff825116936001600160a01b03602084015116946060604085015160208151910120940151936137168551611458565b955f5b86518110156137a5578061372f60019289612b1b565b51516120ae6137916020613743858d612b1b565b510151602081519101206040519283916020830195866040909392919360608101947fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df825260208201520152565b51902061379e828b612b1b565b5201613719565b50979560019550966120ae613829929394986040516137cc816120ae602082018095613483565b519020604051948593602085019788909493926001600160a01b0360809360ff60a08501987fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3865216602085015216604083015260608201520152565b5190206138368286612b1b565b52019290926136d0565b5050604051611f8f816120ae602082018095613483565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116138ce579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610e14575f516001600160a01b038116156138c457905f905f90565b505f906001905f90565b5050505f9160039190565b905f602091828151910182855af11561157f575f513d61393d57506001600160a01b0381163b155b6139085750565b6001600160a01b03907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b60011415613901565b80511561395557805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101000151805115612b165760200151600360ff825116036139b65760406139b09101516020808251830101910161328a565b51461490565b50600190565b5160405160208101917f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e8352604082015260408152611f8f6060826102a1565b6106ba91613a0991612fe3565b90929192614acd565b81601f8201121561018f57805190613a29826102e2565b92613a3760405194856102a1565b8284526020838301011161018f57815f9260208093018386015e8301015290565b60208183031261018f5780519067ffffffffffffffff821161018f57019060608282031261018f5760405191613a8d83610285565b8051613a988161017e565b8352602081015167ffffffffffffffff811161018f5782613aba918301613a12565b602084015260408101519067ffffffffffffffff821161018f57019080601f8301121561018f578151613aec81610882565b92613afa60405194856102a1565b81845260208085019260051b82010192831161018f57602001905b828210613b2757505050604082015290565b8151815260209182019101613b15565b613b4d6106ba949260608352606083019061304c565b92602082015260408184039101526105eb565b60405190613b6f6020836102a1565b5f80835261019e9060208401612aa4565b9060206106ba92818152019061060f565b929190610100840191613ba5818451612b1b565b5191613bbe60408401516020808251830101910161328a565b956020820192613be2613bd2828651612b1b565b5160208082518301019101613a58565b95600360ff613bf2885160ff1690565b1603613f8b57600190515111613f6357613c0c8689614c06565b6001546001600160a01b0316613c376020870191613c3183516001600160a01b031690565b906148db565b9089514614613edc575b5050613c4c88614d0d565b93613c5683612eba565b613c7883613c716116ca6116ca8c516001600160a01b031690565b9351612b1b565b51823b1561018f57613cbe925f92838a604051968795869485937ffd93eba600000000000000000000000000000000000000000000000000000000855260048501613b37565b03925af18015610e1457613ec8575b506060880192613cde845151612ac0565b9860204691015114613cf4575b50505050505050565b613d078499989394979596975151611458565b9660405f9601955b8a518051821015613e7b5781613d2491612b1b565b51613d3f30613d3a83516001600160a01b031690565b614d72565b613d49838b612b1b565b5190818110613e485790613d5c9161158a565b613d66838c612b1b565b52613d72828951612b1b565b5180613d7e848d612b1b565b5110613e04575090613dc3828b613dbc84613db66040613da7600199516001600160a01b031690565b9501516001600160a01b031690565b92612b1b565b51916123dd565b6120ae613de8613dd3838d612b1b565b51604051928391602083019190602083019252565b613df2828d612b1b565b52613dfd818c612b1b565b5001613d0f565b610de29083613e13818e612b1b565b517ff0a43aa7000000000000000000000000000000000000000000000000000000005f52600491909152602452604452606490565b7ff5ad5ab7000000000000000000000000000000000000000000000000000000005f52600484905260245260445260645ffd5b505091945091969750613ea99450613eb7613e99613ebc9794612eba565b9360405196879160208301613b80565b03601f1981018752866102a1565b614e1c565b5f808080808080613ceb565b80611bcd5f613ed6936102a1565b5f613ccd565b969591949098935f989360408601995b8a518051821015613f4f5790613f498d8c613f0984600196612b1b565b518d6020613f40613f32613f2485516001600160a01b031690565b95516001600160a01b031690565b92516001600160a01b031690565b92015192614948565b01613eec565b505093985093985093909495505f80613c41565b7f376fce59000000000000000000000000000000000000000000000000000000005f5260045ffd5b50613f968689614b94565b613c0c565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f5760405191613fd083610269565b8051835260208101519067ffffffffffffffff821161018f57019080601f8301121561018f578151614004926020016131e4565b602082015290565b9092919261401f84610100840151612b1b565b5191614038604084015160208082518301019101613f9b565b9361405161404a876020860151612b1b565b5186614f3c565b6001546001600160a01b0316936140776020820195613c3187516001600160a01b031690565b9660205f9701965b875180518210156140d557906140cf8a61409b83600195612b1b565b5180516001600160a01b0316906140b98c516001600160a01b031690565b6020613f4060408401516001600160a01b031690565b0161407f565b50509296509290945061019e93506140f46140ee613b60565b96612eba565b906140fd61143d565b93614e1c565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f576040519161413883610269565b8051835260208101519067ffffffffffffffff821161018f570181601f8201121561018f5780519061416982610882565b9261417760405194856102a1565b82845260208085019360051b8301019181831161018f5760208101935b8385106141a8575050505050602082015290565b845167ffffffffffffffff811161018f5782016060818503601f19011261018f57604051916141d683610285565b60208201516141e48161017e565b835260408201519267ffffffffffffffff841161018f5760608361420f886020809881980101613a12565b8584015201516040820152815201940193614194565b9080602083519182815201916020808360051b8301019401925f915b83831061425057505050505090565b909192939460208061426e600193601f1986820301875289516105eb565b97019301930191939290614241565b9060206106ba928181520190614225565b9290926142a083610100830151612b1b565b51916142b9604084015160208082518301019101614103565b9260206142c98682890151612b1b565b51946142ea828401966142e388516001600160a01b031690565b9083614fee565b01946142f7865151612ac0565b965f5b8751805182101561436b579061434f61431582600194612b1b565b5183546001600160a01b0316906143338b516001600160a01b031690565b81516001600160a01b031690604060208401519301519361504c565b614359828c612b1b565b52614364818b612b1b565b50016142fa565b505091936143809193965061019e9550612eba565b9060405193613eb785613ea98a6020830161427d565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f57604051916143cb83610269565b8051835260208101519067ffffffffffffffff821161018f57019080601f8301121561018f5781516143fc81610882565b9261440a60405194856102a1565b81845260208085019260051b8201019183831161018f5760208201905b83821061443b575050505050602082015290565b815167ffffffffffffffff811161018f5760209161445e87848094880101613a12565b815201910190614427565b60208183031261018f5780519067ffffffffffffffff821161018f57019060808282031261018f576040519161449e83610248565b80516144a98161017e565b83526020810151602084015260408101517fffffffff000000000000000000000000000000000000000000000000000000008116810361018f57604084015260608101519067ffffffffffffffff821161018f57019080601f8301121561018f5781519161451683610882565b9261452460405194856102a1565b80845260208085019160051b8301019183831161018f5760208101915b838310614555575050505050606082015290565b825167ffffffffffffffff811161018f578201906060828703601f19011261018f576040519061458482610285565b6020830151600281101561018f57825260408301519167ffffffffffffffff831161018f576145cb6060856145c18b602080999881990101613a12565b868501520161155e565b6040820152815201920191614541565b9060208282031261018f57815167ffffffffffffffff811161018f576106ba9201613a12565b9080602083519182815201916020808360051b8301019401925f915b83831061462c57505050505090565b909192939460208061464a600193601f198682030187528951614225565b9701930193019193929061461d565b93929160608552606060e08601926001600160a01b0381511682880152602081015160808801527fffffffff0000000000000000000000000000000000000000000000000000000060408201511660a0880152015191608060c08701528251809152610100860160206101008360051b8901019401915f5b8181106146f55750505050816146f09186604094036020880152614601565b930152565b9091929460ff19898203018452855190815160028110156120505760019282602093928493526040806147358585015160608786015260608501906105eb565b9301511515910152970194019291016146d1565b929161475a81610100860151612b1b565b5193614773604086015160208082518301019101614396565b9560206147838482870151612b1b565b519761479d828901996142e38b516001600160a01b031690565b01956147aa875151612ac0565b945f5b885180518210156148c457906147d96147c98261482a94612b1b565b5160208082518301019101614469565b5f886147f36116ca6116ca6003546001600160a01b031690565b8c6040518097819482937ff964081d0000000000000000000000000000000000000000000000000000000084528860048501614659565b03915afa928315610e1457600193614884928e925f926148a0575b5061486861485a87546001600160a01b031690565b93516001600160a01b031690565b602061487b83516001600160a01b031690565b9201519361504c565b61488e828a612b1b565b526148998189612b1b565b50016147ad565b6148bd9192503d805f833e6148b581836102a1565b8101906145db565b905f614845565b5050929094975061438091965061019e9550612eba565b906001600160a01b0360246020928260405195869485937f5e07a6e6000000000000000000000000000000000000000000000000000000008552166004840152165afa908115610e14575f9161492f575090565b6106ba915060203d602011610e0d57610dff81836102a1565b9193909290156149be576001600160a01b036149bb948180600154169481604051977ff18d03cc0000000000000000000000000000000000000000000000000000000060208a01521660248801521660448601521660648401526084830152608482526149b660a4836102a1565b615191565b50565b906001600160a01b03918261019e9581604051967f23b872dd000000000000000000000000000000000000000000000000000000006020890152166024870152166044850152606484015260648352614a186084846102a1565b166138d9565b614a266124ba565b8051908115614a36576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100548015614a635790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b614a906125ab565b8051908115614aa0576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101548015614a635790565b614ad681612046565b80614adf575050565b614ae881612046565b60018103614b18577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b614b2181612046565b60028103614b5557507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b80614b61600392612046565b14614b695750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b908151602083015103614bde5781514603614bb25761019e916150c5565b7f611487ba000000000000000000000000000000000000000000000000000000005f524660045260245ffd5b7f3bc78edf000000000000000000000000000000000000000000000000000000005f5260045ffd5b80516020820190815114614bde5781514614159081614d01575b50614bb25781614c2f916150c5565b614c926020614c4b6116ca6116ca5f546001600160a01b031690565b83516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015292839190829081906024820190565b03915afa908115610e14575f91614ce2575b5015614cad5750565b517fdb489af4000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b614cfb915060203d602011610e0d57610dff81836102a1565b5f614ca4565b5146141590505f614c20565b90606082016020614d1f825151611458565b9301514614614d2b5750565b905f5b82518051821015614d6c5790614d5b6001926001600160a01b03614d53843093612b1b565b515116614d72565b614d658287612b1b565b5201614d2e565b50509050565b6001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8103614d9b57503190565b906001600160a01b03602460209260405194859384927f70a082310000000000000000000000000000000000000000000000000000000084521660048301525afa908115610e14575f91614ded575090565b90506020813d602011614e14575b81614e08602093836102a1565b8101031261018f575190565b3d9150614dfb565b93909291935f5b60608201518051821015613ceb5781614e3b91612b1b565b516001600160a01b03602084015116815190602060ff8651169301516040519060c08252614e6c60c083018861304c565b82810360208401528a518152898c8c6040614e966020830151606060208801526060870190614225565b910151936040818303910152602080855192838152019401905f905b808210614f1e575050507fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d393614f0786948594614f1594604060019e9d9c9b9a0152606086015284810360808601528d6105eb565b9083820360a08501526105eb565b0390a401614e23565b9250925092602080600192865181520194019201918c928f92614eb2565b919082514603614bb25751614fc6575f5b60208301518051821015614d6c576040614f6a83614f7993612b1b565b5101516001600160a01b031690565b306001600160a01b03821614614f925750600101614f4d565b7f0b9ab599000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b7f93c58e11000000000000000000000000000000000000000000000000000000005f5260045ffd5b514603614bb25751614fc65761500f816001600160a01b03600154166148db565b156150175750565b6001600160a01b03907fcaec9bac000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b906149b6906040956150ad6150c1966001600160a01b0380978a519889967fff883fcf0000000000000000000000000000000000000000000000000000000060208901521660248701521660448501526080606485015260a48401906105eb565b90608483015203601f1981018452836102a1565b0190565b919060400190606082515193019283515103615169575f5b8351805182101561516257816150f291612b1b565b5160408101516001600160a01b0316308114614f92575060200151615118828551612b1b565b5181811061512a5750506001016150dd565b610de2927f1fef5f33000000000000000000000000000000000000000000000000000000005f52929190606493600452602452604452565b5050915050565b7f1816c202000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f806106ba93602081519101845af46151a861301d565b91906151b45750613946565b815115806151fa575b6151c5575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156151bd56fe608080604052346015576108c6908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80635e07a6e614610126578063f18d03cc146100e25763ff883fcf1461003a575f80fd5b346100de5760803660031901126100de57610053610153565b61005b610169565b906044359067ffffffffffffffff82116100de57366023830112156100de57816004013592610089846101ce565b90610097604051928361017f565b84825236602486860101116100de575f6020866100da9760246100c698018387013784010152606435926103ea565b6040519182916020835260208301906101ea565b0390f35b5f80fd5b346100de5760803660031901126100de576100fb610153565b610103610169565b906044356001600160a01b03811681036100de576101249260643592610243565b005b346100de5760203660031901126100de576020610149610144610153565b61020e565b6040519015158152f35b600435906001600160a01b03821682036100de57565b602435906001600160a01b03821682036100de57565b90601f8019910116810190811067ffffffffffffffff8211176101a157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116101a157601f01601f191660200190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b803b1561023e5761021e8161066d565b6102385761022b906104d8565b610233575f90565b600190565b50600190565b505f90565b929061024e8461066d565b6103205761025b846104d8565b61027b576001600160a01b0384636b94637360e11b5f521660045260245ffd5b919290916001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee036102c957506102c692604051916102b760208461017f565b5f808452366020850137610626565b50565b906102c693926001600160a01b03604051947fa9059cbb00000000000000000000000000000000000000000000000000000000602087015216602485015260448401526044835261031b60648461017f565b61055a565b91926001600160a01b0316803b156100de575f92836064926001600160a01b03948560405198899788967fbeabacc800000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401525af180156103995761038d5750565b5f6103979161017f565b565b6040513d5f823e3d90fd5b81601f820112156100de578051906103bb826101ce565b926103c9604051948561017f565b828452602083830101116100de57815f9260208093018386015e8301015290565b9291906103f68461066d565b61042f57610403846104d8565b610423576001600160a01b0384636b94637360e11b5f521660045260245ffd5b61042c93610626565b90565b926001600160a01b035f81610484968296604051988997889687947f4ae000410000000000000000000000000000000000000000000000000000000086521660048501526060602485015260648401906101ea565b9060448301520393165af1908115610399575f916104a0575090565b90503d805f833e6104b1818361017f565b81016020828203126100de57815167ffffffffffffffff81116100de5761042c92016103a4565b5f809160405160208101907fe75235b80000000000000000000000000000000000000000000000000000000082526004815261051560248261017f565b51915afa3d15610553573d610529816101ce565b90610537604051928361017f565b81523d5f602083013e5b8161054a575090565b60209150511490565b6060610541565b9190915f6040518092635229073f60e01b82526001600160a01b03861660048301528260248301526080604483015281836001600160a01b03826105a1608482018a6101ea565b8360648301520393165af1918215610399575f915f936105d5575b50516105cc5761042c9250610850565b61042c926107f6565b915091503d805f833e6105e8818361017f565b8101906040818303126100de5780519182151583036100de57602082015167ffffffffffffffff81116100de5761061f92016103a4565b915f6105bc565b90925f90604051928391635229073f60e01b83526001600160a01b038716600484015260248301526080604483015281836001600160a01b03826105a1608482018a6101ea565b60205f604051828101906301ffc9a760e01b82526301ffc9a760e01b60248201526024815261069d60448261017f565b519084617530fa903d5f5190836107ea575b50826107e0575b5081610760575b816106c6575090565b602091505f90604051838101906301ffc9a760e01b82527fffffffff000000000000000000000000000000000000000000000000000000007ff44bac89000000000000000000000000000000000000000000000000000000001660248201526024815261073460448261017f565b5191617530fa5f513d82610754575b508161074d575090565b9050151590565b6020111591505f610743565b905060205f604051828101906301ffc9a760e01b82527fffffffff000000000000000000000000000000000000000000000000000000006024820152602481526107ab60448261017f565b519084617530fa5f513d826107d4575b50816107ca575b5015906106bd565b905015155f6107c2565b6020111591505f6107bb565b151591505f6106b6565b6020111592505f6106af565b906108015750610859565b81511580610847575b610812575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b1561080a565b90919061039757505b80511561086857805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea264697066735822122073412de79f18d64fa84e8572f6b96024e534a9585bb249a06156504b82479b5264736f6c634300081c0033a2646970667358221220937e34b078f06ebb3fb78c25a74edf7a3b2ffe7b5b8b6d57866a3475eab0c92664736f6c634300081c0033",
"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": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccount7702#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
new file mode 100644
index 0000000..7d8a2a7
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccount7702#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccount7702#ICreateX.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccount7702#ICreateX.json
new file mode 100644
index 0000000..ebe60ab
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/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": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
new file mode 100644
index 0000000..7d8a2a7
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccount7702#SmartAccount7702.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccount7702#SmartAccount7702.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccount7702#SmartAccount7702.json
new file mode 100644
index 0000000..9b9f545
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/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": "0x60a034607757601f6106e838819003918201601f19168301916001600160401b03831184841017607b57808492602094604052833981010312607757516001600160a01b038116810360775760015f556080526040516106589081610090823960805181818160840152818161025a01526103020152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146103e8575080634ae000411461027e578063ab221a761461023b5763beabacc814610048575f80fd5b3461023757606036600319011261023757610061610486565b602435906001600160a01b03821680920361023757604435906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361020f576001600160a01b03906100bb61052b565b169073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82036101435780471061012d575f80808084875af16100ef610562565b9015610128575060207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee915b604051908152a360015f55005b6105eb565b4763cf47918160e01b5f5260045260245260445ffd5b60205f604051828101907fa9059cbb0000000000000000000000000000000000000000000000000000000082528660248201528460448201526044815261018b60648261049c565b519082865af115610204575f513d6101fb5750813b155b6101cf5760207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee9161011b565b507f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b600114156101a2565b6040513d5f823e3d90fd5b7f7fd7572d000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f80fd5b34610237575f3660031901126102375760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461023757606036600319011261023757610297610486565b6024359067ffffffffffffffff821161023757366023830112156102375781600401356102c3816104eb565b906102d1604051928361049c565b8082526020820193366024838301011161023757815f92602460209301873783010152604435926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361020f5761033061052b565b8347106103d15761039c826103b26001600160a01b036103875f807f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e976103cd9b9951908a8c5af1610380610562565b9089610591565b96604051948594606086526060860190610507565b9660208501528387036040850152169486610507565b0390a260015f55604051918291602083526020830190610507565b0390f35b834763cf47918160e01b5f5260045260245260445ffd5b3461023757602036600319011261023757600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361023757817ff44bac89000000000000000000000000000000000000000000000000000000006020931490811561045c575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610455565b600435906001600160a01b038216820361023757565b90601f8019910116810190811067ffffffffffffffff8211176104be57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116104be57601f01601f191660200190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60025f541461053a5760025f55565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b3d1561058c573d90610573826104eb565b91610581604051938461049c565b82523d5f602084013e565b606090565b9061059c57506105eb565b815115806105e2575b6105ad575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156105a5565b8051156105fa57805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212205d08139b46ebd4a7481627e6a878eacbfdd39c4d20ccdfc34a2f8584abc02a6464736f6c634300081c0033",
+ "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146103e8575080634ae000411461027e578063ab221a761461023b5763beabacc814610048575f80fd5b3461023757606036600319011261023757610061610486565b602435906001600160a01b03821680920361023757604435906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361020f576001600160a01b03906100bb61052b565b169073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82036101435780471061012d575f80808084875af16100ef610562565b9015610128575060207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee915b604051908152a360015f55005b6105eb565b4763cf47918160e01b5f5260045260245260445ffd5b60205f604051828101907fa9059cbb0000000000000000000000000000000000000000000000000000000082528660248201528460448201526044815261018b60648261049c565b519082865af115610204575f513d6101fb5750813b155b6101cf5760207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee9161011b565b507f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b600114156101a2565b6040513d5f823e3d90fd5b7f7fd7572d000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f80fd5b34610237575f3660031901126102375760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461023757606036600319011261023757610297610486565b6024359067ffffffffffffffff821161023757366023830112156102375781600401356102c3816104eb565b906102d1604051928361049c565b8082526020820193366024838301011161023757815f92602460209301873783010152604435926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361020f5761033061052b565b8347106103d15761039c826103b26001600160a01b036103875f807f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e976103cd9b9951908a8c5af1610380610562565b9089610591565b96604051948594606086526060860190610507565b9660208501528387036040850152169486610507565b0390a260015f55604051918291602083526020830190610507565b0390f35b834763cf47918160e01b5f5260045260245260445ffd5b3461023757602036600319011261023757600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361023757817ff44bac89000000000000000000000000000000000000000000000000000000006020931490811561045c575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610455565b600435906001600160a01b038216820361023757565b90601f8019910116810190811067ffffffffffffffff8211176104be57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116104be57601f01601f191660200190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60025f541461053a5760025f55565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b3d1561058c573d90610573826104eb565b91610581604051938461049c565b82523d5f602084013e565b606090565b9061059c57506105eb565b815115806105e2575b6105ad575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156105a5565b8051156105fa57805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212205d08139b46ebd4a7481627e6a878eacbfdd39c4d20ccdfc34a2f8584abc02a6464736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {
+ "15970": [
+ {
+ "length": 32,
+ "start": 132
+ },
+ {
+ "length": 32,
+ "start": 602
+ },
+ {
+ "length": 32,
+ "start": 770
+ }
+ ]
+ },
+ "inputSourceName": "project/contracts/smart-accounts/SmartAccount7702.sol",
+ "buildInfoId": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#ICreateX.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#ICreateX.dbg.json
new file mode 100644
index 0000000..7d8a2a7
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#ICreateX.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#ICreateX.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#ICreateX.json
new file mode 100644
index 0000000..ebe60ab
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#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": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#SmartAccountContractPublic.dbg.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#SmartAccountContractPublic.dbg.json
new file mode 100644
index 0000000..7d8a2a7
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#SmartAccountContractPublic.dbg.json
@@ -0,0 +1,4 @@
+{
+ "_format": "hh-sol-dbg-1",
+ "buildInfo": "../build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#SmartAccountContractPublic.json b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#SmartAccountContractPublic.json
new file mode 100644
index 0000000..bf54ff3
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/artifacts/Create3SmartAccountContractPublic#SmartAccountContractPublic.json
@@ -0,0 +1,428 @@
+{
+ "_format": "hh3-artifact-1",
+ "contractName": "SmartAccountContractPublic",
+ "sourceName": "contracts/smart-accounts/SmartAccountContractPublic.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_settler",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_owner",
+ "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": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnableInvalidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "OwnableUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ReentrancyGuardReentrantCall",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SmartAccountInputInvalidLength",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SmartAccountSetAllowedSignersDisabled",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SmartAccountSettlerZero",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "SmartAccountUnauthorizedSender",
+ "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": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "settler",
+ "type": "address"
+ }
+ ],
+ "name": "SettlerSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "allowed",
+ "type": "bool"
+ }
+ ],
+ "name": "SignerAllowedSet",
+ "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": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isSignerAllowed",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "internalType": "bytes4",
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "",
+ "type": "address[]"
+ },
+ {
+ "internalType": "bool[]",
+ "name": "",
+ "type": "bool[]"
+ }
+ ],
+ "name": "setAllowedSigners",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newSettler",
+ "type": "address"
+ }
+ ],
+ "name": "setSettler",
+ "outputs": [],
+ "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"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ],
+ "bytecode": "0x60803461012257601f610d0238819003918201601f19168301916001600160401b03831184841017610126578084926040948552833981010312610122576100468161013a565b906001600160a01b039061005c9060200161013a565b1690811561010f575f80546001600160a01b031981168417825560405193916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556001600160a01b0316801561010057600380546001600160a01b031916821790557f91b7b87cc50ee71ce8dc7cdc2c2d6434b8525023c067481a16db26fa5b5be9ac5f80a2610bb3908161014f8239f35b6321cb06d160e21b5f5260045ffd5b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101225756fe608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c90816301ffc9a7146107e85750806307f19eba1461074b5780631626ba7e146106895780634ae000411461055c578063715018a6146104f85780638da5cb5b146104d3578063ab221a76146104ad578063beabacc8146102bd578063dc1424881461018b578063dddf6ff91461014e5763f2fde38b146100a1575f61000f565b3461014a57602036600319011261014a576001600160a01b036100c2610886565b6100ca610989565b16801561011e576001600160a01b035f548273ffffffffffffffffffffffffffffffffffffffff198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5f80fd5b3461014a57602036600319011261014a576001600160a01b0361016f610886565b165f526002602052602060ff60405f2054166040519015158152f35b3461014a57604036600319011261014a5760043567ffffffffffffffff811161014a573660238201121561014a57806004013590602460206101cc84610971565b6101d9604051918261089c565b848152019260051b8201019036821161014a57602401915b81831061029d5760243567ffffffffffffffff811161014a573660238201121561014a578060040135906024602061022884610971565b610235604051918261089c565b848152019260051b8201019036821161014a57602401915b8183106102845761025c610989565b7fe8d3a4a7000000000000000000000000000000000000000000000000000000005f5260045ffd5b8235801515810361014a5781526020928301920161024d565b82356001600160a01b038116810361014a578152602092830192016101f1565b3461014a57606036600319011261014a576102d6610886565b602435906001600160a01b03821680920361014a57604435906001600160a01b035f541633148015610499575b1561046d576001600160a01b0390610319610a84565b169073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82036103a15780471061038b575f80808084875af161034d610abd565b9015610386575060207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee915b604051908152a360018055005b610b46565b4763cf47918160e01b5f5260045260245260445ffd5b60205f604051828101907fa9059cbb000000000000000000000000000000000000000000000000000000008252866024820152846044820152604481526103e960648261089c565b519082865af115610462575f513d6104595750813b155b61042d5760207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee91610379565b507f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60011415610400565b6040513d5f823e3d90fd5b7f2f55c6f5000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b506001600160a01b03600354163314610303565b3461014a575f36600319011261014a5760206001600160a01b0360035416604051908152f35b3461014a575f36600319011261014a5760206001600160a01b035f5416604051908152f35b3461014a575f36600319011261014a57610510610989565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461014a57606036600319011261014a57610575610886565b60243567ffffffffffffffff811161014a57610595903690600401610907565b90604435916001600160a01b035f541633148015610675575b1561046d576105bb610a84565b82471061065e57917f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e6106298461063f6001600160a01b036106145f8061065a9a51602087018a8c5af161060d610abd565b9089610aec565b9660405194859460608652606086019061094d565b966020850152838703604085015216948661094d565b0390a26001805560405191829160208352602083019061094d565b0390f35b824763cf47918160e01b5f5260045260245260445ffd5b506001600160a01b036003541633146105ae565b3461014a57604036600319011261014a5760243567ffffffffffffffff811161014a576106cd6106c56001600160a01b03923690600401610907565b6004356109c8565b505016156107235760207f1626ba7e000000000000000000000000000000000000000000000000000000005b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b60207fffffffff000000000000000000000000000000000000000000000000000000006106f9565b3461014a57602036600319011261014a576001600160a01b0361076c610886565b610774610989565b1680156107c0578073ffffffffffffffffffffffffffffffffffffffff1960035416176003557f91b7b87cc50ee71ce8dc7cdc2c2d6434b8525023c067481a16db26fa5b5be9ac5f80a2005b7f872c1b44000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461014a57602036600319011261014a57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361014a57817ff44bac89000000000000000000000000000000000000000000000000000000006020931490811561085c575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610855565b600435906001600160a01b038216820361014a57565b90601f8019910116810190811067ffffffffffffffff8211176108be57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116108be57601f01601f191660200190565b81601f8201121561014a5780359061091e826108eb565b9261092c604051948561089c565b8284526020838301011161014a57815f926020809301838601378301015290565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b67ffffffffffffffff81116108be5760051b60200190565b6001600160a01b035f5416330361099c57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b81519190604183036109f8576109f19250602082015190606060408401519301515f1a90610a02565b9192909190565b50505f9160029190565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411610a79579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610462575f516001600160a01b03811615610a6f57905f905f90565b505f906001905f90565b5050505f9160039190565b600260015414610a95576002600155565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b3d15610ae7573d90610ace826108eb565b91610adc604051938461089c565b82523d5f602084013e565b606090565b90610af75750610b46565b81511580610b3d575b610b08575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15610b00565b805115610b5557805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212208ee6318fe9c4c3bbaf0821a1d3e5ae7a52963dec77a5011895cac1fc1e65048264736f6c634300081c0033",
+ "deployedBytecode": "0x608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c90816301ffc9a7146107e85750806307f19eba1461074b5780631626ba7e146106895780634ae000411461055c578063715018a6146104f85780638da5cb5b146104d3578063ab221a76146104ad578063beabacc8146102bd578063dc1424881461018b578063dddf6ff91461014e5763f2fde38b146100a1575f61000f565b3461014a57602036600319011261014a576001600160a01b036100c2610886565b6100ca610989565b16801561011e576001600160a01b035f548273ffffffffffffffffffffffffffffffffffffffff198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5f80fd5b3461014a57602036600319011261014a576001600160a01b0361016f610886565b165f526002602052602060ff60405f2054166040519015158152f35b3461014a57604036600319011261014a5760043567ffffffffffffffff811161014a573660238201121561014a57806004013590602460206101cc84610971565b6101d9604051918261089c565b848152019260051b8201019036821161014a57602401915b81831061029d5760243567ffffffffffffffff811161014a573660238201121561014a578060040135906024602061022884610971565b610235604051918261089c565b848152019260051b8201019036821161014a57602401915b8183106102845761025c610989565b7fe8d3a4a7000000000000000000000000000000000000000000000000000000005f5260045ffd5b8235801515810361014a5781526020928301920161024d565b82356001600160a01b038116810361014a578152602092830192016101f1565b3461014a57606036600319011261014a576102d6610886565b602435906001600160a01b03821680920361014a57604435906001600160a01b035f541633148015610499575b1561046d576001600160a01b0390610319610a84565b169073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82036103a15780471061038b575f80808084875af161034d610abd565b9015610386575060207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee915b604051908152a360018055005b610b46565b4763cf47918160e01b5f5260045260245260445ffd5b60205f604051828101907fa9059cbb000000000000000000000000000000000000000000000000000000008252866024820152846044820152604481526103e960648261089c565b519082865af115610462575f513d6104595750813b155b61042d5760207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee91610379565b507f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60011415610400565b6040513d5f823e3d90fd5b7f2f55c6f5000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b506001600160a01b03600354163314610303565b3461014a575f36600319011261014a5760206001600160a01b0360035416604051908152f35b3461014a575f36600319011261014a5760206001600160a01b035f5416604051908152f35b3461014a575f36600319011261014a57610510610989565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461014a57606036600319011261014a57610575610886565b60243567ffffffffffffffff811161014a57610595903690600401610907565b90604435916001600160a01b035f541633148015610675575b1561046d576105bb610a84565b82471061065e57917f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e6106298461063f6001600160a01b036106145f8061065a9a51602087018a8c5af161060d610abd565b9089610aec565b9660405194859460608652606086019061094d565b966020850152838703604085015216948661094d565b0390a26001805560405191829160208352602083019061094d565b0390f35b824763cf47918160e01b5f5260045260245260445ffd5b506001600160a01b036003541633146105ae565b3461014a57604036600319011261014a5760243567ffffffffffffffff811161014a576106cd6106c56001600160a01b03923690600401610907565b6004356109c8565b505016156107235760207f1626ba7e000000000000000000000000000000000000000000000000000000005b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b60207fffffffff000000000000000000000000000000000000000000000000000000006106f9565b3461014a57602036600319011261014a576001600160a01b0361076c610886565b610774610989565b1680156107c0578073ffffffffffffffffffffffffffffffffffffffff1960035416176003557f91b7b87cc50ee71ce8dc7cdc2c2d6434b8525023c067481a16db26fa5b5be9ac5f80a2005b7f872c1b44000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461014a57602036600319011261014a57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361014a57817ff44bac89000000000000000000000000000000000000000000000000000000006020931490811561085c575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610855565b600435906001600160a01b038216820361014a57565b90601f8019910116810190811067ffffffffffffffff8211176108be57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116108be57601f01601f191660200190565b81601f8201121561014a5780359061091e826108eb565b9261092c604051948561089c565b8284526020838301011161014a57815f926020809301838601378301015290565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b67ffffffffffffffff81116108be5760051b60200190565b6001600160a01b035f5416330361099c57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b81519190604183036109f8576109f19250602082015190606060408401519301515f1a90610a02565b9192909190565b50505f9160029190565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411610a79579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610462575f516001600160a01b03811615610a6f57905f905f90565b505f906001905f90565b5050505f9160039190565b600260015414610a95576002600155565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b3d15610ae7573d90610ace826108eb565b91610adc604051938461089c565b82523d5f602084013e565b606090565b90610af75750610b46565b81511580610b3d575b610b08575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15610b00565b805115610b5557805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212208ee6318fe9c4c3bbaf0821a1d3e5ae7a52963dec77a5011895cac1fc1e65048264736f6c634300081c0033",
+ "linkReferences": {},
+ "deployedLinkReferences": {},
+ "immutableReferences": {},
+ "inputSourceName": "project/contracts/smart-accounts/SmartAccountContractPublic.sol",
+ "buildInfoId": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a"
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json b/packages/evm/ignition/deployments/chain-84532/build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json
new file mode 100644
index 0000000..e262354
--- /dev/null
+++ b/packages/evm/ignition/deployments/chain-84532/build-info/5419ac1d4fbe5c1ffdf9d46f68d706f64646388a.json
@@ -0,0 +1,391 @@
+{
+ "_format": "hh3-sol-build-info-1",
+ "id": "5419ac1d4fbe5c1ffdf9d46f68d706f64646388a",
+ "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/SmartAccountContractPublic.sol": "project/contracts/smart-accounts/SmartAccountContractPublic.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/FallbackMock.sol": "project/contracts/test/smart-accounts/FallbackMock.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": {
+ "viaIR": true,
+ "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/",
+ "project/:@openzeppelin/contracts/=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/cryptography/SignatureChecker.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/SignatureChecker.sol)\n\npragma solidity ^0.8.20;\n\nimport {ECDSA} from \"./ECDSA.sol\";\nimport {IERC1271} from \"../../interfaces/IERC1271.sol\";\n\n/**\n * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA\n * signatures from externally owned accounts (EOAs) as well as ERC-1271 signatures from smart contract wallets like\n * Argent and Safe Wallet (previously Gnosis Safe).\n */\nlibrary SignatureChecker {\n /**\n * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the\n * signature is validated against that smart contract using ERC-1271, otherwise it's validated using `ECDSA.recover`.\n *\n * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus\n * change through time. It could return true at block N and false at block N+1 (or the opposite).\n */\n function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) internal view returns (bool) {\n if (signer.code.length == 0) {\n (address recovered, ECDSA.RecoverError err, ) = ECDSA.tryRecover(hash, signature);\n return err == ECDSA.RecoverError.NoError && recovered == signer;\n } else {\n return isValidERC1271SignatureNow(signer, hash, signature);\n }\n }\n\n /**\n * @dev Checks if a signature is valid for a given signer and data hash. The signature is validated\n * against the signer smart contract using ERC-1271.\n *\n * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus\n * change through time. It could return true at block N and false at block N+1 (or the opposite).\n */\n function isValidERC1271SignatureNow(\n address signer,\n bytes32 hash,\n bytes memory signature\n ) internal view returns (bool) {\n (bool success, bytes memory result) = signer.staticcall(\n abi.encodeCall(IERC1271.isValidSignature, (hash, signature))\n );\n return (success &&\n result.length >= 32 &&\n abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector));\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/ERC165Checker.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165Checker.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the ERC-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface.\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC-165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\n !supportsERC165InterfaceUnchecked(account, INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC-165 as per the spec and support of _interfaceId\n return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n */\n function getSupportedInterfaces(\n address account,\n bytes4[] memory interfaceIds\n ) internal view returns (bool[] memory) {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC-165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC-165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC-165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC-165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n *\n * Some precompiled contracts will falsely indicate support for a given interface, so caution\n * should be exercised when using this function.\n *\n * Interface identification is specified in ERC-165.\n */\n function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\n // prepare call\n bytes memory encodedParams = abi.encodeCall(IERC165.supportsInterface, (interfaceId));\n\n // perform static call\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly (\"memory-safe\") {\n success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0x00)\n }\n\n return success && returnSize >= 0x20 && returnValue > 0;\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 safeguard deadline is in the past\n */\n error SettlerSafeguardPastDeadline(uint256 deadline, uint256 timestamp);\n\n /**\n * @dev The safeguard signature is not authorized by the user\n */\n error SettlerSafeguardInvalidSignature(address user);\n\n /**\n * @dev The safeguard nonce was already used by the user\n */\n error SettlerSafeguardNonceAlreadyUsed(address user, uint256 nonce);\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 whether a safeguard nonce was already used by a user\n * @param user Address of the user being queried\n * @param nonce Safeguard nonce being queried\n */\n function isUserSafeguardNonceUsed(address user, uint256 nonce) external view returns (bool);\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 Sets a safeguard on behalf of a user based on a signature authorized by that user. The user can be\n * an EOA authorizing it with its own ECDSA signature, or a smart account implementing ERC-1271.\n * @param authorization Safeguard authorization signed by the user\n * @param signature EIP-712 signature authorizing the safeguard, verified with ECDSA or ERC-1271. It may be\n * empty for smart accounts that track approved messages on-chain.\n */\n function setSafeguardWithSignature(SafeguardAuthorization memory authorization, bytes memory signature) 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\n/**\n * @dev EIP-712 typed data struct representing a user's authorization to set its safeguard\n * @param user User the safeguard belongs to\n * @param safeguard Encoded safeguard config to be set for the user\n * @param nonce Unique value chosen by the user to prevent replay attacks\n * @param deadline Timestamp by which the safeguard must be set\n */\nstruct SafeguardAuthorization {\n address user;\n bytes safeguard;\n uint256 nonce;\n uint256 deadline;\n}\n\nlibrary SafeguardsHelpers {\n bytes32 internal constant SAFEGUARD_AUTHORIZATION_TYPE_HASH =\n keccak256('SafeguardAuthorization(address user,bytes safeguard,uint256 nonce,uint256 deadline)');\n\n function hash(SafeguardAuthorization memory authorization) internal pure returns (bytes32) {\n return\n keccak256(\n abi.encode(\n SAFEGUARD_AUTHORIZATION_TYPE_HASH,\n authorization.user,\n keccak256(authorization.safeguard),\n authorization.nonce,\n authorization.deadline\n )\n );\n }\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';\nimport '@openzeppelin/contracts/utils/cryptography/SignatureChecker.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 SafeguardsHelpers for SafeguardAuthorization;\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 // Whether a safeguard nonce was already used by a user\n mapping (address => mapping (uint256 => bool)) public override isUserSafeguardNonceUsed;\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 Sets a safeguard on behalf of a user based on a signature authorized by that user. The user can be\n * an EOA authorizing it with its own ECDSA signature, or a smart account implementing ERC-1271.\n * @param authorization Safeguard authorization signed by the user\n * @param signature EIP-712 signature authorizing the safeguard, verified with ECDSA or ERC-1271. It may be\n * empty for smart accounts that track approved messages on-chain.\n */\n function setSafeguardWithSignature(SafeguardAuthorization memory authorization, bytes memory signature)\n external\n override\n {\n uint256 deadline = authorization.deadline;\n if (deadline <= block.timestamp) revert SettlerSafeguardPastDeadline(deadline, block.timestamp);\n\n address user = authorization.user;\n uint256 nonce = authorization.nonce;\n if (isUserSafeguardNonceUsed[user][nonce]) revert SettlerSafeguardNonceAlreadyUsed(user, nonce);\n\n bytes32 typedDataHash = _hashTypedDataV4(authorization.hash());\n if (!_isValidUserSignature(user, typedDataHash, signature)) revert SettlerSafeguardInvalidSignature(user);\n\n // Consuming the nonce makes each signature usable only once, no matter who submits it\n isUserSafeguardNonceUsed[user][nonce] = true;\n _setSafeguard(user, authorization.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 Tells whether a signature over a hash was authorized by a user, supporting both EOAs and smart\n * accounts implementing ERC-1271, such as Safe. ECDSA is attempted first so that EOAs that delegated\n * their code (EIP-7702) are still verified as EOAs instead of being routed to their delegate.\n * Note: unlike ECDSA signatures, ERC-1271 signatures are revocable, so validity is evaluated at\n * execution time and the result may change over time for the same signature.\n * @param user Address that must have authorized the signature\n * @param hash Hash that was signed\n * @param signature Signature to be verified\n */\n function _isValidUserSignature(address user, bytes32 hash, bytes memory signature) internal view returns (bool) {\n (address signer, ECDSA.RecoverError err, ) = ECDSA.tryRecover(hash, signature);\n if (err == ECDSA.RecoverError.NoError && signer == user) return true;\n return SignatureChecker.isValidERC1271SignatureNow(user, hash, signature);\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 virtual 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 virtual 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/SmartAccountContractPublic.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 './SmartAccountContract.sol';\n\n/**\n * @title SmartAccountContractPublic\n * @dev Provides the smart account logic for public use\n */\ncontract SmartAccountContractPublic is SmartAccountContract {\n /**\n * @dev The setAllowedSigners function is disabled\n */\n error SmartAccountSetAllowedSignersDisabled();\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) SmartAccountContract(_settler, _owner) {}\n\n /**\n * @dev Tells whether the signature provided is valid. Any well-formed signature is considered valid.\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 pure override returns (bytes4) {\n (address signer, , ) = ECDSA.tryRecover(hash, signature);\n return signer != address(0) ? EIP1271_MAGIC_VALUE : EIP1271_INVALID_SIGNATURE;\n }\n\n /**\n * @dev Disabled to prevent accidental misuse.\n */\n function setAllowedSigners(address[] memory, bool[] memory) external view override onlyOwner {\n revert SmartAccountSetAllowedSignersDisabled();\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';\nimport '@openzeppelin/contracts/utils/introspection/ERC165Checker.sol';\n\nimport '../interfaces/ISafe.sol';\nimport '../interfaces/ISmartAccount.sol';\nimport '../interfaces/ISmartAccountsHandler.sol';\nimport '../utils/Denominations.sol';\n\ncontract SmartAccountsHandler is ISmartAccountsHandler {\n using ERC165Checker for address;\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 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 return account.supportsInterface(type(ISmartAccount).interfaceId);\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 (bool success, bytes memory data) = account.staticcall(abi.encodeWithSelector(ISafe.getThreshold.selector));\n return success && data.length == 32;\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/FallbackMock.sol": {
+ "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\ncontract FallbackMock {\n fallback() external payable {}\n\n receive() external payable {}\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\nimport { Math } from '@openzeppelin/contracts/utils/math/Math.sol';\n\n/**\n * @title Mimic Helper\n * @dev Collection of helper functions for the Mimic Protocol\n */\ncontract MimicHelper {\n // Basis points scale\n uint16 internal constant BPS_SCALE = 10_000;\n\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 A single percent is greater than 10_000 basis points\n */\n error MimicHelperInvalidPercent();\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 /**\n * @dev Tells a percentage of an amount, rounding down\n * @param amount Amount to compute the percentage of\n * @param percent Percentage to apply, expressed in basis points. 10_000 = 100%, 50 = 0.5%\n */\n function pct(uint256 amount, uint16 percent) external pure returns (uint256) {\n if (percent > BPS_SCALE) revert MimicHelperInvalidPercent();\n return Math.mulDiv(amount, percent, BPS_SCALE);\n }\n}\n"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/deployed_addresses.json b/packages/evm/ignition/deployments/chain-84532/deployed_addresses.json
index ea1eca9..39fe36d 100644
--- a/packages/evm/ignition/deployments/chain-84532/deployed_addresses.json
+++ b/packages/evm/ignition/deployments/chain-84532/deployed_addresses.json
@@ -1,8 +1,16 @@
{
"Create3Controller#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Controller#Controller": "0x6002825BabC837776A08799404fA55f15DCedA6b",
+ "Create3Controller#Controller": "0xD69ab273785a2d65719f13EeeEA2b46c3E814988",
"Create3Settler#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3Settler#Settler": "0x609d831C0068844e11eF85a273c7F356212Fd6D1",
+ "Create3Settler#Settler": "0x8F84Ca9801533CaE282F95924fADb88A3689a34d",
"Create3MimicHelper#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
- "Create3MimicHelper#MimicHelper": "0x5cf82cBED1110fc2f75B3413d53abac492931804"
+ "Create3MimicHelper#MimicHelper": "0x2Ef71E27560874B932EF1cF9E95d340595a92F44",
+ "Create3DynamicCallEncoder#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3DynamicCallEncoder#DynamicCallEncoder": "0x183E61BDE23a80f4D1e003653288d4B4551681ed",
+ "Create3Proxy#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3Proxy#Proxy": "0x8be430d29a2c5692f9345a28506b849C6a99eDaA",
+ "Create3SmartAccount7702#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3SmartAccount7702#SmartAccount7702": "0x14AE3C251881d2214E376bfa38dD98A4Bd33550c",
+ "Create3SmartAccountContractPublic#ICreateX": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed",
+ "Create3SmartAccountContractPublic#SmartAccountContractPublic": "0x2518928fDf52319CC5A9a797354cf159cD2221bB"
}
\ No newline at end of file
diff --git a/packages/evm/ignition/deployments/chain-84532/journal.jsonl b/packages/evm/ignition/deployments/chain-84532/journal.jsonl
index f4ef2f5..4524061 100644
--- a/packages/evm/ignition/deployments/chain-84532/journal.jsonl
+++ b/packages/evm/ignition/deployments/chain-84532/journal.jsonl
@@ -1,51 +1,65 @@
{"chainId":84532,"type":"DEPLOYMENT_INITIALIZE"}
{"artifactId":"Create3Controller#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Controller#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
-{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000017","0x608060405234801561000f575f5ffd5b50604051610e6c380380610e6c83398101604081905261002e91610444565b856001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610172565b505f5b85518110156100a35761009b8682815181106100865761008661051f565b602002602001015160016101c160201b60201c565b600101610068565b505f5b84518110156100e1576100d98582815181106100c4576100c461051f565b6020026020010151600161022060201b60201c565b6001016100a6565b505f5b835181101561011f576101178482815181106101025761010261051f565b6020026020010151600161027760201b60201c565b6001016100e4565b505f5b825181101561015d576101558382815181106101405761014061051f565b602002602001015160016102ce60201b60201c565b600101610122565b5061016781610325565b505050505050610533565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f81815260016020908152604091829020805460ff191685151590811790915591519182527f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f15091015b60405180910390a25050565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d99249101610214565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c39101610214565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c9101610214565b6005805460ff191660ff83169081179091556040517f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b0358905f90a250565b80516001600160a01b0381168114610378575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126103a0575f5ffd5b81516001600160401b038111156103b9576103b961037d565b604051600582901b90603f8201601f191681016001600160401b03811182821017156103e7576103e761037d565b604052918252602081850181019290810186841115610404575f5ffd5b6020860192505b8383101561042a5761041c83610362565b81526020928301920161040b565b5095945050505050565b805160ff81168114610378575f5ffd5b5f5f5f5f5f5f60c08789031215610459575f5ffd5b61046287610362565b60208801519096506001600160401b0381111561047d575f5ffd5b61048989828a01610391565b604089015190965090506001600160401b038111156104a6575f5ffd5b6104b289828a01610391565b606089015190955090506001600160401b038111156104cf575f5ffd5b6104db89828a01610391565b608089015190945090506001600160401b038111156104f8575f5ffd5b61050489828a01610391565b92505061051360a08801610434565b90509295509295509295565b634e487b7160e01b5f52603260045260245ffd5b61092c806105405f395ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c80637d701102116100885780638da5cb5b116100635780638da5cb5b146101ce5780638f72c136146101e8578063d9d8edb9146101fb578063f2fde38b1461021d575f5ffd5b80637d701102146101865780637e8d9637146101a857806384aaa224146101bb575f5ffd5b806361655670116100b8578063616556701461013d578063680038c71461015f578063715018a61461017e575f5ffd5b8063090de7df146100de578063163eed9e146100f35780633d41132f1461012a575b5f5ffd5b6100f16100ec3660046107df565b610230565b005b6101156101013660046108a2565b60036020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100f16101383660046107df565b6102ae565b61011561014b3660046108a2565b60046020525f908152604090205460ff1681565b60055461016c9060ff1681565b60405160ff9091168152602001610121565b6100f1610327565b6101156101943660046108a2565b60026020525f908152604090205460ff1681565b6100f16101b63660046108c2565b61033a565b6100f16101c93660046107df565b61034e565b5f546040516001600160a01b039091168152602001610121565b6100f16101f63660046107df565b6103c7565b6101156102093660046108a2565b60016020525f908152604090205460ff1681565b6100f161022b3660046108a2565b610440565b610238610498565b805182511461025a57604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a9576102a183828151811061027a5761027a6108e2565b6020026020010151838381518110610294576102946108e2565b60200260200101516104dd565b60010161025c565b505050565b6102b6610498565b80518251146102d857604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a95761031f8382815181106102f8576102f86108e2565b6020026020010151838381518110610312576103126108e2565b602002602001015161053c565b6001016102da565b61032f610498565b6103385f610593565b565b610342610498565b61034b816105fa565b50565b610356610498565b805182511461037857604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a9576103bf838281518110610398576103986108e2565b60200260200101518383815181106103b2576103b26108e2565b6020026020010151610637565b60010161037a565b6103cf610498565b80518251146103f157604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a957610438838281518110610411576104116108e2565b602002602001015183838151811061042b5761042b6108e2565b602002602001015161068e565b6001016103f3565b610448610498565b6001600160a01b03811661048f576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b61034b81610593565b5f546001600160a01b03163314610338576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610486565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c391015b60405180910390a25050565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d99249101610530565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6005805460ff191660ff83169081179091556040517f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b0358905f90a250565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c9101610530565b6001600160a01b0382165f81815260016020908152604091829020805460ff191685151590811790915591519182527f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f1509101610530565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610722576107226106e5565b604052919050565b5f67ffffffffffffffff821115610743576107436106e5565b5060051b60200190565b80356001600160a01b0381168114610763575f5ffd5b919050565b5f82601f830112610777575f5ffd5b813561078a6107858261072a565b6106f9565b8082825260208201915060208360051b8601019250858311156107ab575f5ffd5b602085015b838110156107d557803580151581146107c7575f5ffd5b8352602092830192016107b0565b5095945050505050565b5f5f604083850312156107f0575f5ffd5b823567ffffffffffffffff811115610806575f5ffd5b8301601f81018513610816575f5ffd5b80356108246107858261072a565b8082825260208201915060208360051b850101925087831115610845575f5ffd5b6020840193505b8284101561086e5761085d8461074d565b82526020938401939091019061084c565b9450505050602083013567ffffffffffffffff81111561088c575f5ffd5b61089885828601610768565b9150509250929050565b5f602082840312156108b2575f5ffd5b6108bb8261074d565b9392505050565b5f602082840312156108d2575f5ffd5b813560ff811681146108bb575f5ffd5b634e487b7160e01b5f52603260045260245ffdfea26469706673582212204e1a03491d67aedff2296b499cf5fee36529062002d67b286fb08859eac0e13664736f6c634300081c00330000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e0d76433edd9f5df370561bd0af231e72c83cd3a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003f4c47e37a94caee31d0b585f54f3ffa1f2294c90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c76b16fa2fa75d93e08099dc16413d9a083404a1"],"artifactId":"Create3Controller#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Controller#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Controller#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
-{"futureId":"Create3Controller#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000000000170000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000100c608060405234801561000f575f5ffd5b50604051610e6c380380610e6c83398101604081905261002e91610444565b856001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610172565b505f5b85518110156100a35761009b8682815181106100865761008661051f565b602002602001015160016101c160201b60201c565b600101610068565b505f5b84518110156100e1576100d98582815181106100c4576100c461051f565b6020026020010151600161022060201b60201c565b6001016100a6565b505f5b835181101561011f576101178482815181106101025761010261051f565b6020026020010151600161027760201b60201c565b6001016100e4565b505f5b825181101561015d576101558382815181106101405761014061051f565b602002602001015160016102ce60201b60201c565b600101610122565b5061016781610325565b505050505050610533565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f81815260016020908152604091829020805460ff191685151590811790915591519182527f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f15091015b60405180910390a25050565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d99249101610214565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c39101610214565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c9101610214565b6005805460ff191660ff83169081179091556040517f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b0358905f90a250565b80516001600160a01b0381168114610378575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126103a0575f5ffd5b81516001600160401b038111156103b9576103b961037d565b604051600582901b90603f8201601f191681016001600160401b03811182821017156103e7576103e761037d565b604052918252602081850181019290810186841115610404575f5ffd5b6020860192505b8383101561042a5761041c83610362565b81526020928301920161040b565b5095945050505050565b805160ff81168114610378575f5ffd5b5f5f5f5f5f5f60c08789031215610459575f5ffd5b61046287610362565b60208801519096506001600160401b0381111561047d575f5ffd5b61048989828a01610391565b604089015190965090506001600160401b038111156104a6575f5ffd5b6104b289828a01610391565b606089015190955090506001600160401b038111156104cf575f5ffd5b6104db89828a01610391565b608089015190945090506001600160401b038111156104f8575f5ffd5b61050489828a01610391565b92505061051360a08801610434565b90509295509295509295565b634e487b7160e01b5f52603260045260245ffd5b61092c806105405f395ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c80637d701102116100885780638da5cb5b116100635780638da5cb5b146101ce5780638f72c136146101e8578063d9d8edb9146101fb578063f2fde38b1461021d575f5ffd5b80637d701102146101865780637e8d9637146101a857806384aaa224146101bb575f5ffd5b806361655670116100b8578063616556701461013d578063680038c71461015f578063715018a61461017e575f5ffd5b8063090de7df146100de578063163eed9e146100f35780633d41132f1461012a575b5f5ffd5b6100f16100ec3660046107df565b610230565b005b6101156101013660046108a2565b60036020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100f16101383660046107df565b6102ae565b61011561014b3660046108a2565b60046020525f908152604090205460ff1681565b60055461016c9060ff1681565b60405160ff9091168152602001610121565b6100f1610327565b6101156101943660046108a2565b60026020525f908152604090205460ff1681565b6100f16101b63660046108c2565b61033a565b6100f16101c93660046107df565b61034e565b5f546040516001600160a01b039091168152602001610121565b6100f16101f63660046107df565b6103c7565b6101156102093660046108a2565b60016020525f908152604090205460ff1681565b6100f161022b3660046108a2565b610440565b610238610498565b805182511461025a57604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a9576102a183828151811061027a5761027a6108e2565b6020026020010151838381518110610294576102946108e2565b60200260200101516104dd565b60010161025c565b505050565b6102b6610498565b80518251146102d857604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a95761031f8382815181106102f8576102f86108e2565b6020026020010151838381518110610312576103126108e2565b602002602001015161053c565b6001016102da565b61032f610498565b6103385f610593565b565b610342610498565b61034b816105fa565b50565b610356610498565b805182511461037857604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a9576103bf838281518110610398576103986108e2565b60200260200101518383815181106103b2576103b26108e2565b6020026020010151610637565b60010161037a565b6103cf610498565b80518251146103f157604051633ac5d5cd60e21b815260040160405180910390fd5b5f5b82518110156102a957610438838281518110610411576104116108e2565b602002602001015183838151811061042b5761042b6108e2565b602002602001015161068e565b6001016103f3565b610448610498565b6001600160a01b03811661048f576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b61034b81610593565b5f546001600160a01b03163314610338576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610486565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c391015b60405180910390a25050565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d99249101610530565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6005805460ff191660ff83169081179091556040517f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b0358905f90a250565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c9101610530565b6001600160a01b0382165f81815260016020908152604091829020805460ff191685151590811790915591519182527f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f1509101610530565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610722576107226106e5565b604052919050565b5f67ffffffffffffffff821115610743576107436106e5565b5060051b60200190565b80356001600160a01b0381168114610763575f5ffd5b919050565b5f82601f830112610777575f5ffd5b813561078a6107858261072a565b6106f9565b8082825260208201915060208360051b8601019250858311156107ab575f5ffd5b602085015b838110156107d557803580151581146107c7575f5ffd5b8352602092830192016107b0565b5095945050505050565b5f5f604083850312156107f0575f5ffd5b823567ffffffffffffffff811115610806575f5ffd5b8301601f81018513610816575f5ffd5b80356108246107858261072a565b8082825260208201915060208360051b850101925087831115610845575f5ffd5b6020840193505b8284101561086e5761085d8461074d565b82526020938401939091019061084c565b9450505050602083013567ffffffffffffffff81111561088c575f5ffd5b61089885828601610768565b9150509250929050565b5f602082840312156108b2575f5ffd5b6108bb8261074d565b9392505050565b5f602082840312156108d2575f5ffd5b813560ff811681146108bb575f5ffd5b634e487b7160e01b5f52603260045260245ffdfea26469706673582212204e1a03491d67aedff2296b499cf5fee36529062002d67b286fb08859eac0e13664736f6c634300081c00330000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e0d76433edd9f5df370561bd0af231e72c83cd3a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003f4c47e37a94caee31d0b585f54f3ffa1f2294c90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c76b16fa2fa75d93e08099dc16413d9a083404a10000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
-{"futureId":"Create3Controller#ICreateX.deployCreate3","networkInteractionId":1,"nonce":0,"type":"TRANSACTION_PREPARE_SEND"}
-{"futureId":"Create3Controller#ICreateX.deployCreate3","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1400000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x6977ae9db5c3e1d6fdc949c2767ec984078b4a67ec09937554754c594e5dce6c"},"type":"TRANSACTION_SEND"}
-{"futureId":"Create3Controller#ICreateX.deployCreate3","hash":"0x6977ae9db5c3e1d6fdc949c2767ec984078b4a67ec09937554754c594e5dce6c","networkInteractionId":1,"receipt":{"blockHash":"0x8edcee4b904762e59221a76271060aa57a1b1bcdb3c4565680ea9f07f297896e","blockNumber":34206174,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":169,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000bb77d95dfc82899217d15c6e0fa899a17ebaa664","0x8e2b5241fa30452cbf36e924a0aeac3ea10f92148bebd4551e7dfa642e40ccce"]},{"address":"0x6002825BabC837776A08799404fA55f15DCedA6b","data":"0x","logIndex":170,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0x6002825BabC837776A08799404fA55f15DCedA6b","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":171,"topics":["0x77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f150","0x000000000000000000000000e0d76433edd9f5df370561bd0af231e72c83cd3a"]},{"address":"0x6002825BabC837776A08799404fA55f15DCedA6b","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":172,"topics":["0xfa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c3","0x0000000000000000000000003f4c47e37a94caee31d0b585f54f3ffa1f2294c9"]},{"address":"0x6002825BabC837776A08799404fA55f15DCedA6b","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":173,"topics":["0xa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c","0x000000000000000000000000c76b16fa2fa75d93e08099dc16413d9a083404a1"]},{"address":"0x6002825BabC837776A08799404fA55f15DCedA6b","data":"0x","logIndex":174,"topics":["0x17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b0358","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":175,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000006002825babc837776a08799404fa55f15dceda6b"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000001","0x60806040523461031257610be38038038061001981610316565b92833981019060c081830312610312576100328161034f565b60208201519092906001600160401b0381116103125781610054918401610363565b60408301519091906001600160401b0381116103125781610076918501610363565b60608401516001600160401b0381116103125782610095918601610363565b60808501519092906001600160401b0381116103125760a0916100b9918701610363565b9401519460ff8616809603610312576001600160a01b031680156102ff575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a35f5b835181101561017e576001906001600160a01b0361013782876103cd565b5116805f528260205260405f208360ff198254161790557f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f1506020604051858152a201610119565b509150915f5b82518110156101ea576001906001600160a01b036101a282866103cd565b5116805f52600260205260405f208360ff198254161790557f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d99246020604051858152a201610184565b8482855f5b8151811015610255576001906001600160a01b0361020d82856103cd565b5116805f52600360205260405f208360ff198254161790557ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c36020604051858152a2016101ef565b50505f5b81518110156102bf576001906001600160a01b0361027782856103cd565b5116805f52600460205260405f208360ff198254161790557fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c6020604051858152a201610259565b6005805460ff191684179055604051837f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b03585f80a26107ed90816103f68239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761033b57604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361031257565b9080601f83011215610312578151916001600160401b03831161033b578260051b90602080610393818501610316565b80968152019282010192831161031257602001905b8282106103b55750505090565b602080916103c28461034f565b8152019101906103a8565b80518210156103e15760209160051b010190565b634e487b7160e01b5f52603260045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063090de7df1461054e578063163eed9e146105115780633d41132f146104735780636165567014610436578063680038c714610416578063715018a6146103b25780637d701102146103755780637e8d96371461031c57806384aaa2241461027e5780638da5cb5b146102595780638f72c13614610192578063d9d8edb9146101555763f2fde38b146100a8575f80fd5b34610151576020366003190112610151576001600160a01b036100c961063e565b6100d1610778565b168015610125576001600160a01b035f548273ffffffffffffffffffffffffffffffffffffffff198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5f80fd5b34610151576020366003190112610151576001600160a01b0361017661063e565b165f526001602052602060ff60405f2054166040519015158152f35b34610151576101a036610654565b6101a8610778565b8151815103610231575f5b825181101561022f57806001600160a01b036101d160019386610750565b51167f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f15060206102008487610750565b511515835f528582526102228160405f209060ff801983541691151516179055565b604051908152a2016101b3565b005b7feb175734000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610151575f3660031901126101515760206001600160a01b035f5416604051908152f35b346101515761028c36610654565b610294610778565b8151815103610231575f5b825181101561022f57806001600160a01b036102bd60019386610750565b51167fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c60206102ec8487610750565b511515835f526004825261030f8160405f209060ff801983541691151516179055565b604051908152a20161029f565b346101515760203660031901126101515760043560ff811680910361015157610343610778565b8060ff1960055416176005557f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b03585f80a2005b34610151576020366003190112610151576001600160a01b0361039661063e565b165f526002602052602060ff60405f2054166040519015158152f35b34610151575f366003190112610151576103ca610778565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610151575f36600319011261015157602060ff60055416604051908152f35b34610151576020366003190112610151576001600160a01b0361045761063e565b165f526004602052602060ff60405f2054166040519015158152f35b346101515761048136610654565b610489610778565b8151815103610231575f5b825181101561022f57806001600160a01b036104b260019386610750565b51167f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d992460206104e18487610750565b511515835f52600282526105048160405f209060ff801983541691151516179055565b604051908152a201610494565b34610151576020366003190112610151576001600160a01b0361053261063e565b165f526003602052602060ff60405f2054166040519015158152f35b346101515761055c36610654565b610564610778565b8151815103610231575f5b825181101561022f57806001600160a01b0361058d60019386610750565b51167ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c360206105bc8487610750565b511515835f52600382526105df8160405f209060ff801983541691151516179055565b604051908152a20161056f565b6040519190601f01601f1916820167ffffffffffffffff81118382101761061257604052565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff81116106125760051b60200190565b600435906001600160a01b038216820361015157565b9060406003198301126101515760043567ffffffffffffffff8111610151578260238201121561015157806004013561069461068f82610626565b6105ec565b916024602084848152019260051b8201019085821161015157602401915b81831061073057505050916024359067ffffffffffffffff82116101515780602383011215610151578160040135906106ed61068f83610626565b926024602085858152019360051b82010191821161015157602401915b8183106107175750505090565b823580151581036101515781526020928301920161070a565b82356001600160a01b0381168103610151578152602092830192016106b2565b80518210156107645760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b035f5416330361078b57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea2646970667358221220f485daa5f9f2d44d23ef56b3fd6d86ad4155109e4bf89858c4d59af11182e90a64736f6c634300081c0033000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c1000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000001162159c4f5092716a4a4b736e88f32a926fb8dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000007e73487a7ff7099b0429e35b71695dddcd63a58200000000000000000000000000000000000000000000000000000000000000010000000000000000000000008626f6940e2eb28930efb4cef49b2d1f2c9c1199"],"artifactId":"Create3Controller#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3Controller#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3Controller#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3Controller#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000d8360806040523461031257610be38038038061001981610316565b92833981019060c081830312610312576100328161034f565b60208201519092906001600160401b0381116103125781610054918401610363565b60408301519091906001600160401b0381116103125781610076918501610363565b60608401516001600160401b0381116103125782610095918601610363565b60808501519092906001600160401b0381116103125760a0916100b9918701610363565b9401519460ff8616809603610312576001600160a01b031680156102ff575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a35f5b835181101561017e576001906001600160a01b0361013782876103cd565b5116805f528260205260405f208360ff198254161790557f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f1506020604051858152a201610119565b509150915f5b82518110156101ea576001906001600160a01b036101a282866103cd565b5116805f52600260205260405f208360ff198254161790557f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d99246020604051858152a201610184565b8482855f5b8151811015610255576001906001600160a01b0361020d82856103cd565b5116805f52600360205260405f208360ff198254161790557ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c36020604051858152a2016101ef565b50505f5b81518110156102bf576001906001600160a01b0361027782856103cd565b5116805f52600460205260405f208360ff198254161790557fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c6020604051858152a201610259565b6005805460ff191684179055604051837f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b03585f80a26107ed90816103f68239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761033b57604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361031257565b9080601f83011215610312578151916001600160401b03831161033b578260051b90602080610393818501610316565b80968152019282010192831161031257602001905b8282106103b55750505090565b602080916103c28461034f565b8152019101906103a8565b80518210156103e15760209160051b010190565b634e487b7160e01b5f52603260045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063090de7df1461054e578063163eed9e146105115780633d41132f146104735780636165567014610436578063680038c714610416578063715018a6146103b25780637d701102146103755780637e8d96371461031c57806384aaa2241461027e5780638da5cb5b146102595780638f72c13614610192578063d9d8edb9146101555763f2fde38b146100a8575f80fd5b34610151576020366003190112610151576001600160a01b036100c961063e565b6100d1610778565b168015610125576001600160a01b035f548273ffffffffffffffffffffffffffffffffffffffff198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5f80fd5b34610151576020366003190112610151576001600160a01b0361017661063e565b165f526001602052602060ff60405f2054166040519015158152f35b34610151576101a036610654565b6101a8610778565b8151815103610231575f5b825181101561022f57806001600160a01b036101d160019386610750565b51167f77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f15060206102008487610750565b511515835f528582526102228160405f209060ff801983541691151516179055565b604051908152a2016101b3565b005b7feb175734000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610151575f3660031901126101515760206001600160a01b035f5416604051908152f35b346101515761028c36610654565b610294610778565b8151815103610231575f5b825181101561022f57806001600160a01b036102bd60019386610750565b51167fa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c60206102ec8487610750565b511515835f526004825261030f8160405f209060ff801983541691151516179055565b604051908152a20161029f565b346101515760203660031901126101515760043560ff811680910361015157610343610778565b8060ff1960055416176005557f17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b03585f80a2005b34610151576020366003190112610151576001600160a01b0361039661063e565b165f526002602052602060ff60405f2054166040519015158152f35b34610151575f366003190112610151576103ca610778565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610151575f36600319011261015157602060ff60055416604051908152f35b34610151576020366003190112610151576001600160a01b0361045761063e565b165f526004602052602060ff60405f2054166040519015158152f35b346101515761048136610654565b610489610778565b8151815103610231575f5b825181101561022f57806001600160a01b036104b260019386610750565b51167f0329466f8a52b1374ddd654a2b6890da94c718cacde4001884e38cb8570d992460206104e18487610750565b511515835f52600282526105048160405f209060ff801983541691151516179055565b604051908152a201610494565b34610151576020366003190112610151576001600160a01b0361053261063e565b165f526003602052602060ff60405f2054166040519015158152f35b346101515761055c36610654565b610564610778565b8151815103610231575f5b825181101561022f57806001600160a01b0361058d60019386610750565b51167ffa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c360206105bc8487610750565b511515835f52600382526105df8160405f209060ff801983541691151516179055565b604051908152a20161056f565b6040519190601f01601f1916820167ffffffffffffffff81118382101761061257604052565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff81116106125760051b60200190565b600435906001600160a01b038216820361015157565b9060406003198301126101515760043567ffffffffffffffff8111610151578260238201121561015157806004013561069461068f82610626565b6105ec565b916024602084848152019260051b8201019085821161015157602401915b81831061073057505050916024359067ffffffffffffffff82116101515780602383011215610151578160040135906106ed61068f83610626565b926024602085858152019360051b82010191821161015157602401915b8183106107175750505090565b823580151581036101515781526020928301920161070a565b82356001600160a01b0381168103610151578152602092830192016106b2565b80518210156107645760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b035f5416330361078b57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea2646970667358221220f485daa5f9f2d44d23ef56b3fd6d86ad4155109e4bf89858c4d59af11182e90a64736f6c634300081c0033000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c1000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000001162159c4f5092716a4a4b736e88f32a926fb8dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000007e73487a7ff7099b0429e35b71695dddcd63a58200000000000000000000000000000000000000000000000000000000000000010000000000000000000000008626f6940e2eb28930efb4cef49b2d1f2c9c11990000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3Controller#ICreateX.deployCreate3","networkInteractionId":1,"nonce":6,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3Controller#ICreateX.deployCreate3","networkInteractionId":1,"nonce":6,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x4b65d011a87d6b2fca26f6ba62fcacf52f86b86828b0cb31168ffc7ec4c4136c"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Controller#ICreateX.deployCreate3","hash":"0x4b65d011a87d6b2fca26f6ba62fcacf52f86b86828b0cb31168ffc7ec4c4136c","networkInteractionId":1,"receipt":{"blockHash":"0xf2ad1384b886990262f4c774848a1d851d1b8778b761061774c49e907fa47720","blockNumber":46339691,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":324,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000a6a62a94f61c22f41d134c3c57300f1d576c3c24","0x88aac59ee05deb0e69cfc20317d837badde7187d4eba827dc494f560fe7fae7a"]},{"address":"0xD69ab273785a2d65719f13EeeEA2b46c3E814988","data":"0x","logIndex":325,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c10"]},{"address":"0xD69ab273785a2d65719f13EeeEA2b46c3E814988","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":326,"topics":["0x77c2be228290b8130d2d04fdcbbf8b38325c4b5251dd42162b939d5291b7f150","0x0000000000000000000000001162159c4f5092716a4a4b736e88f32a926fb8dd"]},{"address":"0xD69ab273785a2d65719f13EeeEA2b46c3E814988","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":327,"topics":["0xfa088805a5f9d0e7a882a9a4462dbd262d6af56a56eeed6fc4dfc6b6272f75c3","0x0000000000000000000000007e73487a7ff7099b0429e35b71695dddcd63a582"]},{"address":"0xD69ab273785a2d65719f13EeeEA2b46c3E814988","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":328,"topics":["0xa8f11f3ae865f4949dc7b3a31787b81ec502e36457f4eaf39fdb7ee7badcb46c","0x0000000000000000000000008626f6940e2eb28930efb4cef49b2d1f2c9c1199"]},{"address":"0xD69ab273785a2d65719f13EeeEA2b46c3E814988","data":"0x","logIndex":329,"topics":["0x17a16cb66f3fc2ad25dca98c6544248e292af9a9c295fef2b15258b1d01b0358","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":330,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000d69ab273785a2d65719f13eeeea2b46c3e814988"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
{"futureId":"Create3Controller#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
-{"artifactId":"Create3Controller#ICreateX","dependencies":["Create3Controller#ICreateX.deployCreate3","Create3Controller#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Controller#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x6002825BabC837776A08799404fA55f15DCedA6b","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x6977ae9db5c3e1d6fdc949c2767ec984078b4a67ec09937554754c594e5dce6c","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3Controller#Controller","contractAddress":"0x6002825BabC837776A08799404fA55f15DCedA6b","contractName":"Controller","dependencies":["Create3Controller#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Controller#Controller","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Controller#ICreateX","dependencies":["Create3Controller#ICreateX.deployCreate3","Create3Controller#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3Controller#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0xD69ab273785a2d65719f13EeeEA2b46c3E814988","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x4b65d011a87d6b2fca26f6ba62fcacf52f86b86828b0cb31168ffc7ec4c4136c","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3Controller#Controller","contractAddress":"0xD69ab273785a2d65719f13EeeEA2b46c3E814988","contractName":"Controller","dependencies":["Create3Controller#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3Controller#Controller","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"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":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302606","0x60808060405234601557610a06908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c63f964081d14610024575f80fd5b346101245760603660031901126101245760043567ffffffffffffffff8111610124576080600319823603011261012457610060610100604052565b806004013573ffffffffffffffffffffffffffffffffffffffff8116810361012457608052602481013560a05260448101357fffffffff00000000000000000000000000000000000000000000000000000000811681036101245760c05260648101359067ffffffffffffffff82116101245760046100e292369201016101f9565b60e05260243567ffffffffffffffff81116101245761011461010b6101209236906004016102d7565b604435906103f5565b604051918291826103cb565b0390f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761015857604052565b610128565b90601f8019910116810190811067ffffffffffffffff82111761015857604052565b67ffffffffffffffff81116101585760051b60200190565b67ffffffffffffffff811161015857601f01601f191660200190565b81601f82011215610124578035906101ca82610197565b926101d8604051948561015d565b8284526020838301011161012457815f926020809301838601378301015290565b9080601f83011215610124578135916102118361017f565b9261021f604051948561015d565b80845260208085019160051b830101918383116101245760208101915b83831061024b57505050505090565b823567ffffffffffffffff8111610124578201906060828703601f190112610124576040519161027a8361013c565b6020810135600281101561012457835260408101359067ffffffffffffffff8211610124576102b08860206060948401016101b3565b6020850152013590811515820361012457826020939260408594015281520192019161023c565b81601f82011215610124578035906102ee8261017f565b926102fc604051948561015d565b82845260208085019360051b830101918183116101245760208101935b83851061032857505050505090565b843567ffffffffffffffff811161012457820183603f820112156101245760208101356103548161017f565b91610362604051938461015d565b8183526020808085019360051b83010101918683116101245760408201905b83821061039b575050509082525060209485019401610319565b813567ffffffffffffffff8111610124576020916103c08a84808095890101016101b3565b815201910190610381565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b9190918051831161056f57917fffffffff0000000000000000000000000000000000000000000000000000000060c051169260e0519384519161043783610597565b90610441846105e0565b965f955f925b898785106104f05750505050506060928394915f905b82821061047657505050506104739394506106cc565b90565b909192959461048e610488848b610612565b51151590565b156104d6576104ca6104b76104a5896001946106a4565b976104b08686610612565b5190610672565b976104c28585610612565b51519061064e565b925b019092919261045d565b6104ea6001916104b085859a96999a610612565b956104cc565b8498866105548761048861056295610534839c9e9c6105218b8b8e9f60019d9e9f9061051b91610612565b51610757565b96875161052e8383610612565b52610612565b5061054d60208601936105478551151590565b92610612565b9015159052565b156104c2575060209061064e565b9701929190959395610447565b7f66e32eb4000000000000000000000000000000000000000000000000000000005f5260045ffd5b906105a18261017f565b6105ae604051918261015d565b82815280926105bf601f199161017f565b01905f5b8281106105cf57505050565b8060606020809385010152016105c3565b906105ea8261017f565b6105f7604051918261015d565b8281528092610608601f199161017f565b0190602036910137565b80518210156106265760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b9190820180921161065b57565b61063a565b805191908290602001825e015f815290565b6106a29061069461068e94936040519586936020850190610660565b90610660565b03601f19810184528361015d565b565b60206106a2916106be949360405195869284840190610660565b90815203808552018361015d565b6106947fffffffff00000000000000000000000000000000000000000000000000000000949361068e6106a2946040519788951660208601526024850190610660565b604051906040820182811067ffffffffffffffff821117610158576040525f602083606081520152565b6002111561074357565b634e487b7160e01b5f52602160045260245ffd5b909161076161070f565b50815160028110156107435761077681610739565b15610883576001825161078881610739565b61079181610739565b146107be577f51c907b2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6107c661070f565b506020820160408151510361085b5751926107ed6107e5856020015190565b946040015190565b91841015610833576107ff8482610612565b51518210156108335761082461082d9261081e61047396604094610612565b51610612565b51920151151590565b906108a0565b7f0c412584000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f893ed1c1000000000000000000000000000000000000000000000000000000005f5260045ffd5b50610473915061089161070f565b50604060208201519101511515905b9190916108ab61070f565b9281518015908115610946575b506108ec571561093c57604081511061091457602081810151036108ec5780516108e191610953565b825260016020830152565b7fdd42b1e5000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f3202a09c000000000000000000000000000000000000000000000000000000005f5260045ffd5b82525f6020830152565b601f16905015155f6108b8565b9190602081106109a857825181116109a857601f19810190811161065b5761097a81610197565b610987604051918261015d565b818152604061099583610197565b602083019290601f19013684379401905e565b7f326b3d3a000000000000000000000000000000000000000000000000000000005f5260045ffdfea264697066735822122032fe629b918005398497db4d49a65446f6554c13dde6a07068bf9a13aeadaf7864736f6c634300081c0033"],"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":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000a2060808060405234601557610a06908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c63f964081d14610024575f80fd5b346101245760603660031901126101245760043567ffffffffffffffff8111610124576080600319823603011261012457610060610100604052565b806004013573ffffffffffffffffffffffffffffffffffffffff8116810361012457608052602481013560a05260448101357fffffffff00000000000000000000000000000000000000000000000000000000811681036101245760c05260648101359067ffffffffffffffff82116101245760046100e292369201016101f9565b60e05260243567ffffffffffffffff81116101245761011461010b6101209236906004016102d7565b604435906103f5565b604051918291826103cb565b0390f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761015857604052565b610128565b90601f8019910116810190811067ffffffffffffffff82111761015857604052565b67ffffffffffffffff81116101585760051b60200190565b67ffffffffffffffff811161015857601f01601f191660200190565b81601f82011215610124578035906101ca82610197565b926101d8604051948561015d565b8284526020838301011161012457815f926020809301838601378301015290565b9080601f83011215610124578135916102118361017f565b9261021f604051948561015d565b80845260208085019160051b830101918383116101245760208101915b83831061024b57505050505090565b823567ffffffffffffffff8111610124578201906060828703601f190112610124576040519161027a8361013c565b6020810135600281101561012457835260408101359067ffffffffffffffff8211610124576102b08860206060948401016101b3565b6020850152013590811515820361012457826020939260408594015281520192019161023c565b81601f82011215610124578035906102ee8261017f565b926102fc604051948561015d565b82845260208085019360051b830101918183116101245760208101935b83851061032857505050505090565b843567ffffffffffffffff811161012457820183603f820112156101245760208101356103548161017f565b91610362604051938461015d565b8183526020808085019360051b83010101918683116101245760408201905b83821061039b575050509082525060209485019401610319565b813567ffffffffffffffff8111610124576020916103c08a84808095890101016101b3565b815201910190610381565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b9190918051831161056f57917fffffffff0000000000000000000000000000000000000000000000000000000060c051169260e0519384519161043783610597565b90610441846105e0565b965f955f925b898785106104f05750505050506060928394915f905b82821061047657505050506104739394506106cc565b90565b909192959461048e610488848b610612565b51151590565b156104d6576104ca6104b76104a5896001946106a4565b976104b08686610612565b5190610672565b976104c28585610612565b51519061064e565b925b019092919261045d565b6104ea6001916104b085859a96999a610612565b956104cc565b8498866105548761048861056295610534839c9e9c6105218b8b8e9f60019d9e9f9061051b91610612565b51610757565b96875161052e8383610612565b52610612565b5061054d60208601936105478551151590565b92610612565b9015159052565b156104c2575060209061064e565b9701929190959395610447565b7f66e32eb4000000000000000000000000000000000000000000000000000000005f5260045ffd5b906105a18261017f565b6105ae604051918261015d565b82815280926105bf601f199161017f565b01905f5b8281106105cf57505050565b8060606020809385010152016105c3565b906105ea8261017f565b6105f7604051918261015d565b8281528092610608601f199161017f565b0190602036910137565b80518210156106265760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b9190820180921161065b57565b61063a565b805191908290602001825e015f815290565b6106a29061069461068e94936040519586936020850190610660565b90610660565b03601f19810184528361015d565b565b60206106a2916106be949360405195869284840190610660565b90815203808552018361015d565b6106947fffffffff00000000000000000000000000000000000000000000000000000000949361068e6106a2946040519788951660208601526024850190610660565b604051906040820182811067ffffffffffffffff821117610158576040525f602083606081520152565b6002111561074357565b634e487b7160e01b5f52602160045260245ffd5b909161076161070f565b50815160028110156107435761077681610739565b15610883576001825161078881610739565b61079181610739565b146107be577f51c907b2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6107c661070f565b506020820160408151510361085b5751926107ed6107e5856020015190565b946040015190565b91841015610833576107ff8482610612565b51518210156108335761082461082d9261081e61047396604094610612565b51610612565b51920151151590565b906108a0565b7f0c412584000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f893ed1c1000000000000000000000000000000000000000000000000000000005f5260045ffd5b50610473915061089161070f565b50604060208201519101511515905b9190916108ab61070f565b9281518015908115610946575b506108ec571561093c57604081511061091457602081810151036108ec5780516108e191610953565b825260016020830152565b7fdd42b1e5000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f3202a09c000000000000000000000000000000000000000000000000000000005f5260045ffd5b82525f6020830152565b601f16905015155f6108b8565b9190602081106109a857825181116109a857601f19810190811161065b5761097a81610197565b610987604051918261015d565b818152604061099583610197565b602083019290601f19013684379401905e565b7f326b3d3a000000000000000000000000000000000000000000000000000000005f5260045ffdfea264697066735822122032fe629b918005398497db4d49a65446f6554c13dde6a07068bf9a13aeadaf7864736f6c634300081c0033","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":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x5edc629f13984c96aa3ff85cbbf46862bef15efdb281af68fee82bd6cc99e8ab"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3DynamicCallEncoder#ICreateX.deployCreate3","hash":"0x5edc629f13984c96aa3ff85cbbf46862bef15efdb281af68fee82bd6cc99e8ab","networkInteractionId":1,"receipt":{"blockHash":"0xa0da6667c4a70093ff28da22306d33a711cd48ef494511e4b2a532bcd0aaa30c","blockNumber":46339705,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":145,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000001d9bd3390aaef5bbcf3beb4f60e0ee28805f6779","0xa13cc826172bbf7683ce89033f741800ae55529a93ee495908820a8471d913b0"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":146,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000183e61bde23a80f4d1e003653288d4b4551681ed"]}],"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":"0x183E61BDE23a80f4D1e003653288d4B4551681ed","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x5edc629f13984c96aa3ff85cbbf46862bef15efdb281af68fee82bd6cc99e8ab","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3DynamicCallEncoder#DynamicCallEncoder","contractAddress":"0x183E61BDE23a80f4D1e003653288d4B4551681ed","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"}
{"artifactId":"Create3Settler#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3Settler#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
-{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000018","0x610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122063c7f17d2676ae9340ccf0078bc40725749c3c4dd9198f82832bc411d2d1333764736f6c634300081c00330000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"],"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":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000000001800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005126610180604052348015610010575f5ffd5b506040516150e63803806150e683398101604081905261002f916102aa565b604080518082018252601681527f4d696d69632050726f746f636f6c20536574746c657200000000000000000000602080830191909152825180840190935260018352603160f81b9083015290826001600160a01b0381166100ab57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100b4816101c4565b50600180556100c4826002610213565b610120526100d3816003610213565b61014052815160208084019190912060e052815190820120610100524660a05261015f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0382166101605260405161018290610282565b604051809103905ff08015801561019b573d5f5f3e3d5ffd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055506104859050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208351101561022e5761022783610245565b905061023f565b816102398482610373565b5060ff90505b92915050565b5f5f829050601f8151111561026f578260405163305a27a960e01b81526004016100a2919061042d565b805161027a82610462565b179392505050565b6109c58061472183390190565b80516001600160a01b03811681146102a5575f5ffd5b919050565b5f5f604083850312156102bb575f5ffd5b6102c48361028f565b91506102d26020840161028f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061030357607f821691505b60208210810361032157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561036e57805f5260205f20601f840160051c8101602085101561034c5750805b601f840160051c820191505b8181101561036b575f8155600101610358565b50505b505050565b81516001600160401b0381111561038c5761038c6102db565b6103a08161039a84546102ef565b84610327565b6020601f8211600181146103d2575f83156103bb5750848201515b5f19600385901b1c1916600184901b17845561036b565b5f84815260208120601f198516915b8281101561040157878501518255602094850194600190920191016103e1565b508482101561041e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610321575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161421761050a5f395f81816103440152818161049c015281816106cd015281816112770152818161147401528181611585015261223b01525f610bd601525f610ba401525f61294301525f61291b01525f61287601525f6128a001525f6128ca01526142175ff3fe60806040526004361061010c575f3560e01c80638da5cb5b116100a1578063cbc9104511610071578063f2fde38b11610057578063f2fde38b14610314578063f77c479114610333578063fee2b7a714610366575f5ffd5b8063cbc91045146102d6578063f0801868146102f5575f5ffd5b80638da5cb5b14610239578063911929df14610255578063c422661f14610281578063c4bb6af5146102a0575f5ffd5b8063715018a6116100dc578063715018a6146101c057806377c8fb6b146101d45780637f411c79146101f357806384b0196e14610212575f5ffd5b80630fc27cf6146101175780632e5a2458146101385780634987ed2f1461016a5780636ccae054146101a1575f5ffd5b3661011357005b5f5ffd5b348015610122575f5ffd5b50610136610131366004612dc9565b610385565b005b348015610143575f5ffd5b50610157610152366004613366565b610399565b6040519081526020015b60405180910390f35b348015610175575f5ffd5b50600454610189906001600160a01b031681565b6040516001600160a01b039091168152602001610161565b3480156101ac575f5ffd5b506101366101bb3660046133de565b6103af565b3480156101cb575f5ffd5b50610136610465565b3480156101df575f5ffd5b50600554610189906001600160a01b031681565b3480156101fe575f5ffd5b5061013661020d36600461341c565b610478565b34801561021d575f5ffd5b50610226610587565b60405161016197969594939291906135ca565b348015610244575f5ffd5b505f546001600160a01b0316610189565b348015610260575f5ffd5b5061027461026f366004612dc9565b6105e5565b6040516101619190613653565b34801561028c575f5ffd5b5061013661029b366004612dc9565b61068e565b3480156102ab575f5ffd5b506101576102ba366004613665565b600660209081525f928352604080842090915290825290205481565b3480156102e1575f5ffd5b506101366102f036600461368f565b61069f565b348015610300575f5ffd5b5061013661030f36600461341c565b6106a9565b34801561031f575f5ffd5b5061013661032e366004612dc9565b61076e565b34801561033e575f5ffd5b506101897f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101576103803660046136c9565b6107c1565b61038d6107d1565b61039681610816565b50565b5f6103a58484846108ac565b90505b9392505050565b6103b76107d1565b6103bf610948565b6001600160a01b0382166103ff576040517f54328a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61040a83838361098b565b816001600160a01b0316836001600160a01b03167fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a8058360405161044f91815260200190565b60405180910390a361046060018055565b505050565b61046d6107d1565b6104765f6109c4565b565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa1580156104e3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050791906136fb565b6105345760405163a7ac57a960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b5f5a9050610543836001610a20565b5f5a61054f908361371a565b9050806040517fa523ba4900000000000000000000000000000000000000000000000000000000815260040161052b91815260200190565b5f6060805f5f5f6060610598610b9d565b6105a0610bcf565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6001600160a01b0381165f90815260076020526040902080546060919061060b90613739565b80601f016020809104026020016040519081016040528092919081815260200182805461063790613739565b80156106825780601f1061065957610100808354040283529160200191610682565b820191905f5260205f20905b81548152906001019060200180831161066557829003601f168201915b50505050509050919050565b6106966107d1565b61039681610bfc565b6103963382610c52565b5f3360405163d9d8edb960e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d9d8edb990602401602060405180830381865afa158015610714573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073891906136fb565b6107605760405163a7ac57a960e01b81526001600160a01b038216600482015260240161052b565b61076a825f610a20565b5050565b6107766107d1565b6001600160a01b0381166107b8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161052b565b610396816109c4565b5f6107cb82610ccb565b92915050565b5f546001600160a01b03163314610476576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161052b565b6001600160a01b038116610856576040517f42af048a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e654905f90a250565b5f7fabd98b1a5498f7ce6ce5fd671f1a1c2ad437b155c4c12281f925612823c72e886108d784610ccb565b83865f01518760200151805190602001206108f58960400151610d6e565b6040805160208101979097528601949094526001600160a01b039092166060850152608084015260a083015260c082015260e0016040516020818303038152906040528051906020012090509392505050565b600260015403610984576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036109b9576104608282610d80565b610460838383610e2b565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a28610948565b5f5b8251811015610b93575f838281518110610a4657610a4661376b565b60200260200101515f015190505f848381518110610a6657610a6661376b565b60200260200101516020015190505f858481518110610a8757610a8761376b565b6020026020010151604001519050610aa183838388610e9f565b6020838101516001600160a01b03165f9081526006825260408082206060870151835290925220439055825160ff16610ae357610ade838361164c565b610b4a565b825160ff165f1901610af957610ade83836119d0565b825160ff1660011901610b1057610ade8383611a90565b82516040517f7cdbcbf100000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161052b565b610b558284336108ac565b6040518581527f120985525cfb78f6c03f96986f9687f49caf81e29350d21fa052e8c0df211ebb9060200160405180910390a2505050600101610a2a565b5061076a60018055565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006002611bb6565b905090565b6060610bca7f00000000000000000000000000000000000000000000000000000000000000006003611bb6565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f493e783f4ed464086f434b9d42b1b8fb97375d1fdc91692c73551281526d22be905f90a250565b6001600160a01b0382165f908152600760205260408120610c7291612d60565b6001600160a01b0382165f908152600760205260409020610c9382826137d7565b506040516001600160a01b038316907f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f4905f90a25050565b5f7fbd51147cb801db5aa8dc80920aabcbe45ea95c1767e31bc3339f62d8f0d046f9825f015183602001518460400151856060015186608001518760a0015180519060200120610d1e8960c00151611c60565b610d2b8a60e00151611da6565b8a61010001518b6101200151604051602001610d519b9a99989796959493929190613892565b604051602081830303815290604052805190602001209050919050565b5f81604051602001610d51919061390c565b80471015610dc3576040517fcf4791810000000000000000000000000000000000000000000000000000000081524760048201526024810182905260440161052b565b5f5f836001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610e0d576040519150601f19603f3d011682016040523d82523d5f602084013e610e12565b606091505b509150915081610e2557610e2581611eba565b50505050565b6040516001600160a01b0383811660248301526044820183905261046091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611efc565b60408401516001600160a01b03163014610ef65760408085015190517f30b078bf0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6060840151610f31576040517f58e8d18100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808501516001600160a01b03165f90815260068252604080822060608801518352909252205415610fab57602084015160608501516040517f9756f94d0000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161052b565b6005546001600160a01b0316156110e4576020808501516001600160a01b03165f9081526007909152604081208054610fe390613739565b80601f016020809104026020016040519081016040528092919081815260200182805461100f90613739565b801561105a5780601f106110315761010080835404028352916020019161105a565b820191905f5260205f20905b81548152906001019060200180831161103d57829003601f168201915b505050505090505f815111156110e2576005546040517fdbd902180000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063dbd90218906110b59088908590600401613b29565b5f6040518083038186803b1580156110cb575f5ffd5b505afa1580156110dd573d5f5f3e3d5ffd5b505050505b505b5f6110ee85611f81565b9050801561118d57428560800151116111425760808501516040517f95d3dc22000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b8351421080159061118b5784516040517f2c39717b000000000000000000000000000000000000000000000000000000008152600481019190915242602482015260440161052b565b505b8360400151518560c0015151146111d0576040517f9dca144800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8560c0015151811015611273575f8660c0015182815181106111f6576111f661376b565b60200260200101516020015190505f8660400151838151811061121b5761121b61376b565b6020026020010151905081811115611269576040517f8ffa61fa000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161052b565b50506001016111d2565b505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663680038c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f59190613b4d565b90505f8160ff1687610120015111611310578160ff16611317565b8661012001515b90508087610140015151101561136b57610140870151516040517fcd0ce69900000000000000000000000000000000000000000000000000000000815261052b918391600401918252602082015260400190565b5f5f90505f60405180602001604052806113848b610ccb565b905290505f61139a61139583611fd0565b61200d565b90505f5b8a61014001515181101561152f575f6113d5838d610140015184815181106113c8576113c861376b565b6020026020010151612054565b9050846001600160a01b0316816001600160a01b031611611435576040517fce98854c0000000000000000000000000000000000000000000000000000000081526001600160a01b0380871660048301528216602482015260440161052b565b6040517f616556700000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015291955085915f917f000000000000000000000000000000000000000000000000000000000000000090911690636165567090602401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df91906136fb565b1590508015611525576040517ff24706660000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505060010161139e565b505f6115486115426113958c8e336108ac565b8a612054565b6040517f163eed9e0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063163eed9e90602401602060405180830381865afa1580156115ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ee91906136fb565b1580156115f9575088155b9050801561163e576040517f100158a80000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161052b565b505050505050505050505050565b5f8260a001518060200190518101906116659190613c16565b90505f82602001518060200190518101906116809190613d93565b905061168c828261207c565b60208401516004545f916116a9916001600160a01b0316906122ed565b905046835f01510361170b575f5b836040015151811015611709575f846040015182815181106116db576116db61376b565b60200260200101519050611700815f01518860200151865f0151846020015187612371565b506001016116b7565b505b5f611715846123b1565b83516040517f7b4da5de0000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637b4da5de906117609089908990600401613efe565b5f604051808303815f87803b158015611777575f5ffd5b505af1158015611789573d5f5f3e3d5ffd5b50505050468460200151036119c8575f84606001515167ffffffffffffffff8111156117b7576117b7612de4565b6040519080825280602002602001820160405280156117e0578160200160208202803683370190505b5090505f5b856060015151811015611990575f866060015182815181106118095761180961376b565b602002602001015190505f611821825f01513061246d565b90505f8584815181106118365761183661376b565b602002602001015190508082101561188b576040517ff5ad5ab700000000000000000000000000000000000000000000000000000000815260048101859052602481018390526044810182905260640161052b565b611895818361371a565b8585815181106118a7576118a761376b565b6020026020010181815250505f886040015185815181106118ca576118ca61376b565b60200260200101519050808686815181106118e7576118e761376b565b6020026020010151101561195557848686815181106119085761190861376b565b60209081029190910101516040517ff0a43aa7000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044810182905260640161052b565b611980845f015185604001518888815181106119735761197361376b565b602002602001015161098b565b5050600190920191506117e59050565b506119bb8787836040516020016119a79190613f22565b604051602081830303815290604052612524565b6119c68787856125b7565b505b505050505050565b5f8260a001518060200190518101906119e99190613f34565b90506119f5818361263b565b60208301516004545f91611a12916001600160a01b0316906122ed565b90505f5b826020015151811015611a69575f83602001518281518110611a3a57611a3a61376b565b60200260200101519050611a60815f015187602001518360400151846020015187612371565b50600101611a16565b50604080515f815260208101909152611a859085908590612524565b610e258484836125b7565b5f8260a00151806020019051810190611aa99190613fc0565b9050611aba818385602001516126fc565b5f81602001515167ffffffffffffffff811115611ad957611ad9612de4565b604051908082528060200260200182016040528015611b0c57816020015b6060815260200190600190039081611af75790505b5090505f5b826020015151811015611b93575f83602001518281518110611b3557611b3561376b565b602090810291909101810151878201518151928201516040830151600454939550611b6d946001600160a01b0390941693919061279a565b838381518110611b7f57611b7f61376b565b602090810291909101015250600101611b11565b50611baa8484836040516020016119a7919061410a565b610e25848460016125b7565b606060ff8314611bd057611bc98361282d565b90506107cb565b818054611bdc90613739565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890613739565b8015611c535780601f10611c2a57610100808354040283529160200191611c53565b820191905f5260205f20905b815481529060010190602001808311611c3657829003601f168201915b5050505050905092915050565b5f5f825167ffffffffffffffff811115611c7c57611c7c612de4565b604051908082528060200260200182016040528015611ca5578160200160208202803683370190505b5090505f5b8351811015611d76577fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da4848281518110611ce657611ce661376b565b60200260200101515f0151858381518110611d0357611d0361376b565b602002602001015160200151604051602001611d3b939291909283526001600160a01b03919091166020830152604082015260600190565b60405160208183030381529060405280519060200120828281518110611d6357611d6361376b565b6020908102919091010152600101611caa565b5080604051602001611d88919061390c565b60405160208183030381529060405280519060200120915050919050565b5f5f825167ffffffffffffffff811115611dc257611dc2612de4565b604051908082528060200260200182016040528015611deb578160200160208202803683370190505b5090505f5b8351811015611d76577ff7a396f96f3810db1cfde06de38d32fc29d56b63cf9d9aee2c10c91ef7273bb1848281518110611e2c57611e2c61376b565b60200260200101515f0151858381518110611e4957611e4961376b565b60200260200101516020015180519060200120604051602001611e7f939291909283526020830191909152604082015260600190565b60405160208183030381529060405280519060200120828281518110611ea757611ea761376b565b6020908102919091010152600101611df0565b805115611eca5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f60205f8451602086015f885af180611f1b576040513d5f823e3d81fd5b50505f513d91508115611f32578060011415611f3f565b6001600160a01b0384163b155b15610e25576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b80515f9060ff1615611f9557506001919050565b5f8260a00151806020019051810190611fae9190613c16565b90508060200151815f015103611fc75750600192915050565b51461492915050565b8051604080517f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e6020820152908101919091525f90606001610d51565b5f6107cb61201961286a565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f5f5f5f6120628686612993565b92509250925061207282826129dc565b5090949350505050565b81515f904614801590612093575046836020015114155b905080156120b65760405163308a43dd60e11b815246600482015260240161052b565b826060015151826040015151146120f9576040517f1816c20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8360600151518110156121f2575f8460600151828151811061211f5761211f61376b565b602002602001015190505f81604001519050306001600160a01b0316816001600160a01b03160361216e57604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b5f826020015190505f8660400151858151811061218d5761218d61376b565b60200260200101519050818110156121e2576040517f1fef5f3300000000000000000000000000000000000000000000000000000000815260048101869052602481018290526044810183905260640161052b565b5050600190920191506120fb9050565b5060208301518351146104605781516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201525f917f00000000000000000000000000000000000000000000000000000000000000001690637d70110290602401602060405180830381865afa158015612280573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a491906136fb565b1590508015610e255782516040517fdb489af40000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240161052b565b6040517f5e07a6e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301525f9190841690635e07a6e690602401602060405180830381865afa15801561234d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906136fb565b801561239557600454612390906001600160a01b031685878686612adf565b6123aa565b6123aa6001600160a01b038616858585612b38565b5050505050565b606081606001515167ffffffffffffffff8111156123d1576123d1612de4565b6040519080825280602002602001820160405280156123fa578160200160208202803683370190505b50905046826020015103612468575f5b82606001515181101561246657612441836060015182815181106124305761243061376b565b60200260200101515f01513061246d565b8282815181106124535761245361376b565b602090810291909101015260010161240a565b505b919050565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038416036124a357506001600160a01b038116316107cb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015612500573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc9919061411c565b5f5b8360e0015151811015610e25575f8460e00151828151811061254a5761254a61376b565b60200260200101519050845f015160ff16815f015186602001516001600160a01b03167fee2c98c99b683f71058b8744fea294a411482f07d55c98b392917e9286f22f1388888887602001516040516125a69493929190614133565b60405180910390a450600101612526565b6020830151335f5b8560c00151518110156119c8575f8660c0015182815181106125e3576125e361376b565b60200260200101515f01519050612604816001600160a01b03166103481490565b61263257612632818585896040015186815181106126245761262461376b565b602002602001015189612371565b506001016125bf565b8151461461265e5760405163308a43dd60e11b815246600482015260240161052b565b60208101515115612682576040516393c58e1160e01b815260040160405180910390fd5b5f5b826020015151811015610460575f836020015182815181106126a8576126a861376b565b6020026020010151604001519050306001600160a01b0316816001600160a01b0316036126f357604051630b9ab59960e01b81526001600160a01b038216600482015260240161052b565b50600101612684565b8251461461271f5760405163308a43dd60e11b815246600482015260240161052b565b60208201515115612743576040516393c58e1160e01b815260040160405180910390fd5b600454612759906001600160a01b0316826122ed565b610460576040517fcaec9bac0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161052b565b60606128238663ff883fcf60e01b878787876040516024016127bf949392919061418a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b71565b9695505050505050565b60605f61283983612be3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156128c257507f000000000000000000000000000000000000000000000000000000000000000046145b156128ec57507f000000000000000000000000000000000000000000000000000000000000000090565b610bca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f83516041036129ca576020840151604085015160608601515f1a6129bc88828585612c23565b9550955095505050506129d5565b505081515f91506002905b9250925092565b5f8260038111156129ef576129ef61377f565b036129f8575050565b6001826003811115612a0c57612a0c61377f565b03612a43576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115612a5757612a5761377f565b03612a91576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6003826003811115612aa557612aa561377f565b0361076a576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161052b565b6040516001600160a01b038086166024830152808516604483015283166064820152608481018290526119c89086907ff18d03cc000000000000000000000000000000000000000000000000000000009060a4016127bf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e259186918216906323b872dd90608401610e58565b60605f5f846001600160a01b031684604051612b8d91906141cb565b5f60405180830381855af49150503d805f8114612bc5576040519150601f19603f3d011682016040523d82523d5f602084013e612bca565b606091505b5091509150612bda858383612ceb565b95945050505050565b5f60ff8216601f8111156107cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612c5c57505f91506003905082612ce1565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612cad573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612cd857505f925060019150829050612ce1565b92505f91508190505b9450945094915050565b606082612d0057612cfb82611eba565b6103a8565b8151158015612d1757506001600160a01b0384163b155b15612d59576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161052b565b50806103a8565b508054612d6c90613739565b5f825580601f10612d7b575050565b601f0160209004905f5260205f209081019061039691905b80821115612da6575f8155600101612d93565b5090565b6001600160a01b0381168114610396575f5ffd5b803561246881612daa565b5f60208284031215612dd9575f5ffd5b81356103a881612daa565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b60405290565b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051610160810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b6040516080810167ffffffffffffffff81118282101715612e1b57612e1b612de4565b604051601f8201601f1916810167ffffffffffffffff81118282101715612eb457612eb4612de4565b604052919050565b5f67ffffffffffffffff821115612ed557612ed5612de4565b50601f01601f191660200190565b5f82601f830112612ef2575f5ffd5b8135612f05612f0082612ebc565b612e8b565b818152846020838601011115612f19575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff821115612f4e57612f4e612de4565b5060051b60200190565b5f60608284031215612f68575f5ffd5b612f70612df8565b823581529050602082013567ffffffffffffffff811115612f8f575f5ffd5b612f9b84828501612ee3565b602083015250604082013567ffffffffffffffff811115612fba575f5ffd5b8201601f81018413612fca575f5ffd5b8035612fd8612f0082612f35565b8082825260208201915060208360051b850101925086831115612ff9575f5ffd5b6020840193505b8284101561301b578335825260209384019390910190613000565b60408501525091949350505050565b60ff81168114610396575f5ffd5b80356124688161302a565b5f82601f830112613052575f5ffd5b8135613060612f0082612f35565b8082825260208201915060208360061b860101925085831115613081575f5ffd5b602085015b838110156130cc576040818803121561309d575f5ffd5b6130a5612e21565b81356130b081612daa565b8152602082810135818301529084529290920191604001613086565b5095945050505050565b5f82601f8301126130e5575f5ffd5b81356130f3612f0082612f35565b8082825260208201915060208360051b860101925085831115613114575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613137575f5ffd5b86016040818903601f1901121561314c575f5ffd5b613154612e21565b60208201358152604082013567ffffffffffffffff811115613174575f5ffd5b6131838a602083860101612ee3565b6020830152508085525050602083019250602081019050613119565b5f82601f8301126131ae575f5ffd5b81356131bc612f0082612f35565b8082825260208201915060208360051b8601019250858311156131dd575f5ffd5b602085015b838110156130cc57803567ffffffffffffffff811115613200575f5ffd5b61320f886020838a0101612ee3565b845250602092830192016131e2565b5f610160828403121561322f575f5ffd5b613237612e44565b905061324282613038565b815261325060208301612dbe565b602082015261326160408301612dbe565b6040820152606082810135908201526080808301359082015260a082013567ffffffffffffffff811115613293575f5ffd5b61329f84828501612ee3565b60a08301525060c082013567ffffffffffffffff8111156132be575f5ffd5b6132ca84828501613043565b60c08301525060e082013567ffffffffffffffff8111156132e9575f5ffd5b6132f5848285016130d6565b60e08301525061010082013567ffffffffffffffff811115613315575f5ffd5b61332184828501612ee3565b61010083015250610120828101359082015261014082013567ffffffffffffffff81111561334d575f5ffd5b6133598482850161319f565b6101408301525092915050565b5f5f5f60608486031215613378575f5ffd5b833567ffffffffffffffff81111561338e575f5ffd5b61339a86828701612f58565b935050602084013567ffffffffffffffff8111156133b6575f5ffd5b6133c28682870161321e565b92505060408401356133d381612daa565b809150509250925092565b5f5f5f606084860312156133f0575f5ffd5b83356133fb81612daa565b9250602084013561340b81612daa565b929592945050506040919091013590565b5f6020828403121561342c575f5ffd5b813567ffffffffffffffff811115613442575f5ffd5b8201601f81018413613452575f5ffd5b8035613460612f0082612f35565b8082825260208201915060208360051b850101925086831115613481575f5ffd5b602084015b8381101561355757803567ffffffffffffffff8111156134a4575f5ffd5b85016060818a03601f190112156134b9575f5ffd5b6134c1612df8565b602082013567ffffffffffffffff8111156134da575f5ffd5b6134e98b60208386010161321e565b825250604082013567ffffffffffffffff811115613505575f5ffd5b6135148b602083860101612f58565b602083015250606082013567ffffffffffffffff811115613533575f5ffd5b6135428b602083860101612ee3565b60408301525084525060209283019201613486565b509695505050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f8151808452602084019350602083015f5b828110156135c05781518652602095860195909101906001016135a2565b5093949350505050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f61360460e0830189613562565b82810360408401526136168189613562565b90508660608401526001600160a01b03861660808401528460a084015282810360c08401526136458185613590565b9a9950505050505050505050565b602081525f6103a86020830184613562565b5f5f60408385031215613676575f5ffd5b823561368181612daa565b946020939093013593505050565b5f6020828403121561369f575f5ffd5b813567ffffffffffffffff8111156136b5575f5ffd5b6136c184828501612ee3565b949350505050565b5f602082840312156136d9575f5ffd5b813567ffffffffffffffff8111156136ef575f5ffd5b6136c18482850161321e565b5f6020828403121561370b575f5ffd5b815180151581146103a8575f5ffd5b818103818111156107cb57634e487b7160e01b5f52601160045260245ffd5b600181811c9082168061374d57607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b601f82111561046057805f5260205f20601f840160051c810160208510156137b85750805b601f840160051c820191505b818110156123aa575f81556001016137c4565b815167ffffffffffffffff8111156137f1576137f1612de4565b613805816137ff8454613739565b84613793565b6020601f821160018114613837575f83156138205750848201515b5f19600385901b1c1916600184901b1784556123aa565b5f84815260208120601f198516915b828110156138665787850151825560209485019460019092019101613846565b508482101561388357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b8b815260ff8b1660208201526001600160a01b038a1660408201526001600160a01b03891660608201528760808201528660a08201528560c08201528460e0820152836101008201526101606101208201525f6138f3610160830185613562565b9050826101408301529c9b505050505050505050505050565b81515f90829060208501835b82811015613936578151845260209384019390910190600101613918565b509195945050505050565b5f8151808452602084019350602083015f5b828110156135c057815180516001600160a01b031687526020908101518188015260409096019590910190600101613953565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f1985840301885281518051845260208101519050604060208501526139d46040850182613562565b6020998a01999094509290920191506001016139a2565b50909695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156139eb57601f19858403018852613a2f838351613562565b6020988901989093509190910190600101613a13565b805160ff1682525f6020820151613a6760208501826001600160a01b03169052565b506040820151613a8260408501826001600160a01b03169052565b50606082015160608401526080820151608084015260a082015161016060a0850152613ab2610160850182613562565b905060c083015184820360c0860152613acb8282613941565b91505060e083015184820360e0860152613ae58282613986565b915050610100830151848203610100860152613b018282613562565b915050610120830151610120850152610140830151848203610140860152612bda82826139f7565b604081525f613b3b6040830185613a45565b8281036020840152612bda8185613562565b5f60208284031215613b5d575f5ffd5b81516103a88161302a565b5f613b75612f0084612f35565b83815290506020810160608402830185811115613b90575f5ffd5b835b81811015613bee575f60608289031215613baa575f5ffd5b613bb2612df8565b90508151613bbf81612daa565b8152602082810151908201526040820151613bd981612daa565b60408201528352602090920191606001613b92565b5050509392505050565b5f82601f830112613c07575f5ffd5b6103a883835160208501613b68565b5f60208284031215613c26575f5ffd5b815167ffffffffffffffff811115613c3c575f5ffd5b820160808185031215613c4d575f5ffd5b613c55612e68565b8151815260208083015190820152604082015167ffffffffffffffff811115613c7c575f5ffd5b8201601f81018613613c8c575f5ffd5b8051613c9a612f0082612f35565b8082825260208201915060208360061b850101925088831115613cbb575f5ffd5b6020840193505b82841015613d0b576040848a031215613cd9575f5ffd5b613ce1612e21565b8451613cec81612daa565b8152602085810151818301529083526040909401939190910190613cc2565b6040850152505050606082015167ffffffffffffffff811115613d2c575f5ffd5b613d3886828501613bf8565b606083015250949350505050565b5f82601f830112613d55575f5ffd5b8151613d63612f0082612ebc565b818152846020838601011115613d77575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613da3575f5ffd5b815167ffffffffffffffff811115613db9575f5ffd5b820160608185031215613dca575f5ffd5b613dd2612df8565b8151613ddd81612daa565b8152602082015167ffffffffffffffff811115613df8575f5ffd5b613e0486828501613d46565b602083015250604082015167ffffffffffffffff811115613e23575f5ffd5b80830192505084601f830112613e37575f5ffd5b8151613e45612f0082612f35565b8082825260208201915060208360051b860101925087831115613e66575f5ffd5b6020850194505b82851015613e88578451825260209485019490910190613e6d565b6040840152509095945050505050565b805182525f602082015160606020850152613eb66060850182613562565b9050604083015184820360408601528181518084526020840191506020830193505f92505b808310156130cc5783518252602082019150602084019350600183019250613edb565b604081525f613f106040830185613a45565b8281036020840152612bda8185613e98565b602081525f6103a86020830184613590565b5f60208284031215613f44575f5ffd5b815167ffffffffffffffff811115613f5a575f5ffd5b820160408185031215613f6b575f5ffd5b613f73612e21565b81518152602082015167ffffffffffffffff811115613f90575f5ffd5b80830192505084601f830112613fa4575f5ffd5b613fb385835160208501613b68565b6020820152949350505050565b5f60208284031215613fd0575f5ffd5b815167ffffffffffffffff811115613fe6575f5ffd5b820160408185031215613ff7575f5ffd5b613fff612e21565b81518152602082015167ffffffffffffffff81111561401c575f5ffd5b80830192505084601f830112614030575f5ffd5b815161403e612f0082612f35565b8082825260208201915060208360051b86010192508783111561405f575f5ffd5b602085015b838110156140f957805167ffffffffffffffff811115614082575f5ffd5b86016060818b03601f19011215614097575f5ffd5b61409f612df8565b60208201516140ad81612daa565b8152604082015167ffffffffffffffff8111156140c8575f5ffd5b6140d78c602083860101613d46565b6020838101919091526060939093015160408301525084529283019201614064565b506020840152509095945050505050565b602081525f6103a860208301846139f7565b5f6020828403121561412c575f5ffd5b5051919050565b608081525f6141456080830187613a45565b82810360208401526141578187613e98565b9050828103604084015261416b8186613562565b9050828103606084015261417f8185613562565b979650505050505050565b6001600160a01b03851681526001600160a01b0384166020820152608060408201525f6141ba6080830185613562565b905082606083015295945050505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220fae3247dd7a33c3cd300206de44d56570a43a7690ab25372a739d3c2704b371e64736f6c634300081c00336080604052348015600e575f5ffd5b506109a98061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80635e07a6e614610043578063f18d03cc1461006b578063ff883fcf14610080575b5f5ffd5b610056610051366004610636565b6100a0565b60405190151581526020015b60405180910390f35b61007e61007936600461064f565b6100ec565b005b61009361008e366004610703565b6101cb565b60405161006291906107d3565b5f816001600160a01b03163b5f036100b957505f919050565b6100c2826102b3565b156100cf57506001919050565b6100d882610364565b156100e557506001919050565b505f919050565b6100f5846102b3565b1561017d576040517fbeabacc80000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015283811660248301526044820183905285169063beabacc8906064015f604051808303815f87803b158015610162575f5ffd5b505af1158015610174573d5f5f3e3d5ffd5b505050506101c5565b61018684610364565b1561019c57610197848484846103d3565b6101c5565b604051636b94637360e11b81526001600160a01b03851660048201526024015b60405180910390fd5b50505050565b60606101d6856102b3565b1561026d576040517f4ae000410000000000000000000000000000000000000000000000000000000081526001600160a01b03861690634ae0004190610224908790879087906004016107e5565b5f604051808303815f875af115801561023f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526102669190810190610863565b90506102ab565b61027685610364565b1561028757610266858585856104a2565b604051636b94637360e11b81526001600160a01b03861660048201526024016101bc565b949350505050565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527ff44bac890000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b038316906301ffc9a790602401602060405180830381865afa92505050801561034e575060408051601f3d908101601f1916820190925261034b918101906108a4565b60015b61035957505f919050565b92915050565b919050565b5f816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156103bf575060408051601f3d908101601f191682019092526103bc918101906108bd565b60015b6103ca57505f919050565b50600192915050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0384161461047f57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261047a90859085905f6104a2565b61049b565b604080515f81526020810190915261049b9085908490846104a2565b5050505050565b60605f5f866001600160a01b0316635229073f8786885f6040518563ffffffff1660e01b81526004016104d894939291906108d4565b5f604051808303815f875af11580156104f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261051a9190810190610928565b9150915084515f146105365761053186838361054b565b610540565b61054082826105c3565b979650505050505050565b6060826105605761055b826105de565b6105bc565b815115801561057757506001600160a01b0384163b155b156105b9576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101bc565b50805b9392505050565b6060826105d8576105d3826105de565b610359565b50919050565b8051156105ee5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b038116811461035f575f5ffd5b5f60208284031215610646575f5ffd5b6105bc82610620565b5f5f5f5f60808587031215610662575f5ffd5b61066b85610620565b935061067960208601610620565b925061068760408601610620565b9396929550929360600135925050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156106d4576106d4610697565b604052919050565b5f67ffffffffffffffff8211156106f5576106f5610697565b50601f01601f191660200190565b5f5f5f5f60808587031215610716575f5ffd5b61071f85610620565b935061072d60208601610620565b9250604085013567ffffffffffffffff811115610748575f5ffd5b8501601f81018713610758575f5ffd5b803561076b610766826106dc565b6106ab565b81815288602083850101111561077f575f5ffd5b816020840160208301375f91810160200191909152949793965093946060013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105bc60208301846107a5565b6001600160a01b0384168152606060208201525f61080660608301856107a5565b9050826040830152949350505050565b5f82601f830112610825575f5ffd5b8151610833610766826106dc565b818152846020838601011115610847575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215610873575f5ffd5b815167ffffffffffffffff811115610889575f5ffd5b6102ab84828501610816565b8051801515811461035f575f5ffd5b5f602082840312156108b4575f5ffd5b6105bc82610895565b5f602082840312156108cd575f5ffd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6108fb60808301856107a5565b90506002831061091957634e487b7160e01b5f52602160045260245ffd5b82606083015295945050505050565b5f5f60408385031215610939575f5ffd5b61094283610895565b9150602083015167ffffffffffffffff81111561095d575f5ffd5b61096985828601610816565b915050925092905056fea264697066735822122063c7f17d2676ae9340ccf0078bc40725749c3c4dd9198f82832bc411d2d1333764736f6c634300081c00330000000000000000000000006002825babc837776a08799404fa55f15dceda6b0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
-{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":1,"type":"TRANSACTION_PREPARE_SEND"}
-{"futureId":"Create3Settler#ICreateX.deployCreate3","networkInteractionId":1,"nonce":1,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1400000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x347f2a0e4b16a680bf4de17133f67fcd3064187582909a5b3e2a4300af3dad4e"},"type":"TRANSACTION_SEND"}
-{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0x347f2a0e4b16a680bf4de17133f67fcd3064187582909a5b3e2a4300af3dad4e","networkInteractionId":1,"receipt":{"blockHash":"0xbc039972be3e02e6ac06c666c4367e94aff81a8beee5cc46eaabfdf735790591","blockNumber":34206254,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":135,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000001a68cee754105b3f806c92f6f59e3175f0b0fc2c","0xd5d101dbdd8374fa4f730d105879acbe6c9855ed7be06a019574ba923a935d7d"]},{"address":"0x609d831C0068844e11eF85a273c7F356212Fd6D1","data":"0x","logIndex":136,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000003a0ce8115b4913f42c4928d6bc3f554e9a81468b"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":137,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000609d831c0068844e11ef85a273c7f356212fd6d1"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000004302602","0x6080806040523460aa575f516020615bc85f395f51905f525460ff8160401c16609b576002600160401b03196001600160401b038216016049575b604051615b1990816100af8239f35b6001600160401b0319166001600160401b039081175f516020615bc85f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80603a565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80630fc27cf614610179578063403b5659146101745780634987ed2f1461016f57806355ef9b861461016a5780636ccae05414610165578063715018a61461016057806384b0196e1461015b57806384d44e28146101565780638da5cb5b14610151578063911929df1461014c5780639479591614610147578063950026511461014257806396d45f511461013d5780639c2a2c6e146101385780639f86fded14610133578063a49eacff1461012e578063c0c53b8b14610129578063cbc9104514610124578063e5814ea61461011f578063f2fde38b1461011a578063f77c4791146101155763faa390d70361000e576112aa565b611285565b611258565b611232565b6111f8565b610fbb565b610f55565b610edd565b610eb7565b610e8a565b610e19565b610d68565b610821565b6107dc565b6107b2565b6106bd565b610554565b610478565b610429565b610403565b610344565b6101a0565b6001600160a01b0381160361018f57565b5f80fd5b359061019e8261017e565b565b3461018f57602036600319011261018f576001600160a01b036004356101c58161017e565b6101cd611ebd565b16801561020c57806001600160a01b031960015416176001557f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e6545f80a2005b7f42af048a000000000000000000000000000000000000000000000000000000005f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6080810190811067ffffffffffffffff82111761026457604052565b610234565b6040810190811067ffffffffffffffff82111761026457604052565b6060810190811067ffffffffffffffff82111761026457604052565b90601f8019910116810190811067ffffffffffffffff82111761026457604052565b6040519061019e610120836102a1565b6040519061019e6020836102a1565b67ffffffffffffffff811161026457601f01601f191660200190565b81601f8201121561018f57803590610315826102e2565b9261032360405194856102a1565b8284526020838301011161018f57815f926020809301838601378301015290565b3461018f57604036600319011261018f5760043567ffffffffffffffff811161018f576080600319823603011261018f576040519061038282610248565b80600401356103908161017e565b825260248101359067ffffffffffffffff821161018f576103b9606492600436918401016102fe565b602084015260448101356040840152013560608201526024359067ffffffffffffffff821161018f576103f36100189236906004016102fe565b906112e5565b5f91031261018f57565b3461018f575f36600319011261018f5760206001600160a01b0360015416604051908152f35b3461018f57604036600319011261018f576004356104468161017e565b6001600160a01b0360243591165f52600660205260405f20905f52602052602060ff60405f2054166040519015158152f35b3461018f57606036600319011261018f576004356104958161017e565b6024356104a18161017e565b604435906104ad611ebd565b6104b5612366565b6001600160a01b03811692831561052c576001600160a01b03816104fd857fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805956020956123dd565b6040519485521692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b7f54328a09000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461018f575f36600319011261018f5761056c611ebd565b5f6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90602080835192838152019201905f5b81811061062c5750505090565b825184526020938401939092019160010161061f565b919361069b6106ba96949561068d6001600160a01b03947f0f00000000000000000000000000000000000000000000000000000000000000875260e0602088015260e08701906105eb565b9085820360408701526105eb565b9460608401521660808201525f60a082015260c081840391015261060f565b90565b3461018f575f36600319011261018f577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610789575b1561072b576107036124ba565b61070b6125ab565b9061072761071761143d565b6040519384933091469186610642565b0390f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10154156106f6565b3461018f57602036600319011261018f576004355f526004602052602060405f2054604051908152f35b3461018f575f36600319011261018f5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461018f57602036600319011261018f576001600160a01b036004356108468161017e565b165f52600560205261072761086761086e60405f20604051928380926114c2565b03826102a1565b6040519182916020835260208301906105eb565b67ffffffffffffffff81116102645760051b60200190565b81601f8201121561018f578035906108b182610882565b926108bf60405194856102a1565b82845260208085019360061b8301019181831161018f57602001925b8284106108e9575050505090565b60408483031261018f576020604091825161090381610269565b863561090e8161017e565b815282870135838201528152019301926108db565b9080601f8301121561018f57813561093a81610882565b9261094860405194856102a1565b81845260208085019260051b8201019183831161018f5760208201905b83821061097457505050505090565b813567ffffffffffffffff811161018f57602091610997878480948801016102fe565b815201910190610965565b60ff81160361018f57565b9080601f8301121561018f578135916109c583610882565b926109d360405194856102a1565b80845260208085019160051b8301019183831161018f5760208101915b8383106109ff57505050505090565b823567ffffffffffffffff811161018f5782016080818703601f19011261018f5760405190610a2d82610248565b6020810135610a3b816109a2565b82526040810135610a4b8161017e565b6020830152606081013567ffffffffffffffff811161018f57876020610a73928401016102fe565b6040830152608081013567ffffffffffffffff811161018f57602091010186601f8201121561018f57803590610aa882610882565b91610ab660405193846102a1565b80835260208084019160051b8301019189831161018f5760208101915b838310610af1575050505060608201528152602092830192016109f0565b823567ffffffffffffffff811161018f578201906040828d03601f19011261018f5760405190610b2082610269565b6020830135825260408301359167ffffffffffffffff831161018f57610b4e8e6020809695819601016102fe565b83820152815201920191610ad3565b9190916101208184031261018f57610b736102c3565b92610b7d82610193565b8452610b8b60208301610193565b60208501526040820135604085015260608201356060850152608082013567ffffffffffffffff811161018f5781610bc491840161089a565b608085015260a082013567ffffffffffffffff811161018f5781610be99184016102fe565b60a085015260c082013560c085015260e082013567ffffffffffffffff811161018f5781610c18918401610923565b60e085015261010082013567ffffffffffffffff811161018f57610c3c92016109ad565b610100830152565b919060608382031261018f57604051610c5c81610285565b809380358252602081013567ffffffffffffffff811161018f5783610c82918301610923565b602083015260408101359067ffffffffffffffff821161018f57019180601f8401121561018f578235610cb481610882565b93610cc260405195866102a1565b81855260208086019260051b82010192831161018f57602001905b828210610ced5750505060400152565b8135815260209182019101610cdd565b606060031982011261018f5760043567ffffffffffffffff811161018f5781610d2891600401610b5d565b9160243567ffffffffffffffff811161018f5782610d4891600401610c44565b916044359067ffffffffffffffff821161018f576106ba916004016102fe565b3461018f57610d7636610cfd565b5f5460405163d9d8edb960e01b815233600482015291939190602090829060249082906001600160a01b03165afa908115610e14575f91610de5575b506115ab575b7fa7ac57a9000000000000000000000000000000000000000000000000000000005f523360045260245b5ffd5b610e07915060203d602011610e0d575b610dff81836102a1565b81019061156b565b5f610db2565b503d610df5565b61157f565b3461018f57606036600319011261018f5760043567ffffffffffffffff811161018f57610e4a903690600401610c44565b60243567ffffffffffffffff811161018f57602091610e70610e82923690600401610b5d565b60443591610e7d8361017e565b612b2f565b604051908152f35b3461018f57602036600319011261018f57610018600435610eaa8161017e565b610eb2611ebd565b612c12565b3461018f575f36600319011261018f5760206001600160a01b0360035416604051908152f35b3461018f57610eeb36610cfd565b5f5460405163d9d8edb960e01b815233600482015291929190602090829060249082906001600160a01b03165afa908115610e14575f91610f36575b5015610db8576100189261267c565b610f4f915060203d602011610e0d57610dff81836102a1565b5f610f27565b3461018f57602036600319011261018f576001600160a01b03600435610f7a8161017e565b610f82611ebd565b16806001600160a01b031960025416176002557f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef75f80a2005b3461018f57606036600319011261018f57600435610fd88161017e565b60243590610fe58261017e565b604435610ff18161017e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549267ffffffffffffffff61104060ff604087901c1615611032565b1590565b9567ffffffffffffffff1690565b16801590816111f0575b60011490816111e6575b1590816111dd575b506111b5576110c692846110bd600167ffffffffffffffff197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b61115057611cfa565b6110cc57005b61112168ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6111b06801000000000000000068ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b611cfa565b7ff92ee8a9000000000000000000000000000000000000000000000000000000005f5260045ffd5b9050155f61105c565b303b159150611054565b85915061104a565b3461018f57602036600319011261018f5760043567ffffffffffffffff811161018f5761122c6100189136906004016102fe565b3361229e565b3461018f575f36600319011261018f5760206001600160a01b0360025416604051908152f35b3461018f57602036600319011261018f576100186004356112788161017e565b611280611ebd565b611e02565b3461018f575f36600319011261018f5760206001600160a01b035f5416604051908152f35b3461018f57602036600319011261018f5760043567ffffffffffffffff811161018f57610e826112e06020923690600401610b5d565b612eba565b60608101514281111561140e575080516001600160a01b03169160408201519061133b61133483611327876001600160a01b03165f52600660205260405f2090565b905f5260205260405f2090565b5460ff1690565b6113d45761102e61135d9161135761135286611f1c565b611f95565b86612055565b61139f57829161139761138a60209361132761019e976001600160a01b03165f52600660205260405f2090565b805460ff19166001179055565b01519061229e565b7f3cd453ef000000000000000000000000000000000000000000000000000000005f526001600160a01b03831660045260245ffd5b7fa628820a000000000000000000000000000000000000000000000000000000005f526001600160a01b038416600452602482905260445ffd5b7f59a7ab2d000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b6040519061144c6020836102a1565b5f808352366020840137565b9061146282610882565b61146f60405191826102a1565b8281528092611480601f1991610882565b0190602036910137565b90600182811c921680156114b8575b60208310146114a457565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611499565b5f92918154916114d18361148a565b808352926001811690811561152657506001146114ed57505050565b5f9081526020812093945091925b83831061150c575060209250010190565b6001816020929493945483858701015201910191906114fb565b915050602093945060ff929192191683830152151560051b010190565b9061019e61155792604051938480926114c2565b03836102a1565b5190811515820361018f57565b9081602091031261018f576106ba9061155e565b6040513d5f823e3d90fd5b9190820391821161159757565b634e487b7160e01b5f52601160045260245ffd5b91905a906115b7612366565b60208401516001600160a01b0316308103611c8b5750604084015115611c63576115e084612eba565b6115f2815f52600460205260405f2090565b54611c3857610100850180515115611c105780515160208401515103611be8576002546001600160a01b031680611b06575b5061162e8661397d565b611a8a575b608086019586515195604085019687515103611a62575f5b885180518210156116b05761166282602092612b1b565b510151611670828a51612b1b565b5181811161168257505060010161164b565b7f8ffa61fa000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050856116d66116ca6116ca5f546001600160a01b031690565b6001600160a01b031690565b9360405163680038c760e01b8152602081600481895afa908115610e14575f91611a33575b5060c08501519060ff1680821115611a2b5750965b60e0850197885151908082106119fd57505061173a6113525f986117326102d3565b9081526139bc565b945f5b89518051821015611849576117558261175c92612b1b565b51886139fc565b986001600160a01b0381166001600160a01b038b16111561180e5750604051630616556760e41b81526001600160a01b038a16600482015289906020816024818d5afa908115610e14575f916117f0575b50156117bc575060010161173d565b7ff2470666000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b611808915060203d8111610e0d57610dff81836102a1565b8c6117ad565b7fce98854c000000000000000000000000000000000000000000000000000000005f526001600160a01b03908116600452891660245260445ffd5b5050866118638661185e611352338688612b2f565b6139fc565b604051630b1f76cf60e11b81526001600160a01b03821660048201529091602090829060249082905afa908115610e14575f916119de575b5015806119d7575b6119a35750436118c36118b583612eba565b5f52600460205260405f2090565b556118cf835151612ac0565b935f5b84515181101561190757806118eb87600193878761312e565b6118f58289612b1b565b526119008188612b1b565b50016118d2565b50611924610de2936119789361191d8282613391565b3391612b2f565b7f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e05f80a261197160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5a9061158a565b7fa523ba49000000000000000000000000000000000000000000000000000000005f52600452602490565b7f100158a8000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b505f6118a3565b6119f7915060203d602011610e0d57610dff81836102a1565b8661189b565b7fcd0ce699000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905096611710565b611a55915060203d602011611a5b575b611a4d81836102a1565b810190613119565b886116fb565b503d611a43565b7f9dca1448000000000000000000000000000000000000000000000000000000005f5260045ffd5b606086015142811115611ad75750825142811115611aa85750611633565b7f2c39717b000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b7f95d3dc22000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b95925f9592959491945b85518051821015611bd95781611b2591612b1b565b5190611b5d611b58611b4160208501516001600160a01b031690565b6001600160a01b03165f52600560205260405f2090565b611543565b918251611b70575b506001915001611b10565b611b826001600160a01b038b166116ca565b92833b1561018f57611bac935f92604051809681948293631001f1c560e21b8452600484016130f4565b03915afa918215610e145760019215611b655780611bcd5f611bd3936102a1565b806103f9565b5f611b65565b5050929550929390935f611624565b7f95784c9b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fe5dfb56a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f0413dc4a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f58e8d181000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30b078bf000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b60405190611cce6040836102a1565b600182527f31000000000000000000000000000000000000000000000000000000000000006020830152565b611d11611da892611d096134f9565b6112806134f9565b611d196134f9565b611d216134f9565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055611d8e604051611d566040826102a1565b601681527f4d696d69632050726f746f636f6c20536574746c6572000000000000000000006020820152611d88611cbf565b90612c81565b6001600160a01b03166001600160a01b03195f5416175f55565b6040516108e080820182811067ffffffffffffffff821117610264578291615204833903905ff0908115610e1457610eb26001600160a01b0361019e93166001600160a01b03166001600160a01b03196001541617600155565b6001600160a01b03168015611e91576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303611ef057565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b6001600160a01b03815116906020810151602081519101209060606040820151910151906040519260208401947f1d67bc34682cf5afae07788c838639fb56351f501a18353e3dd38b5f06c8166a865260408501526060840152608083015260a082015260a08152611f8f60c0826102a1565b51902090565b604290611fa0614a1e565b611fa8614a88565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152611ff960c0826102a1565b51902090604051917f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201522090565b634e487b7160e01b5f52602160045260245ffd5b6004111561205057565b612032565b9190916120628284612fe3565b5060048110156120505715908161210c575b50612104575f926120ae6120bc85946040519283916020830195630b135d3f60e11b875260248401526040604484015260648301906105eb565b03601f1981018352826102a1565b51915afa6120c861301d565b816120f6575b816120d7575090565b905060208180518101031261018f5760200151630b135d3f60e11b1490565b9050602081511015906120ce565b505050600190565b90506001600160a01b038083169116145f612074565b81811061212d575050565b5f8155600101612122565b90601f8211612145575050565b61019e917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f5260205f20906020601f840160051c83019310612190575b601f0160051c0190612122565b9091508190612183565b9190601f81116121a957505050565b61019e925f5260205f20906020601f840160051c8301931061219057601f0160051c0190612122565b919091825167ffffffffffffffff8111610264576121fa816121f4845461148a565b8461219a565b6020601f821160011461223957819061222a9394955f9261222e575b50508160011b915f199060031b1c19161790565b9055565b015190505f80612216565b601f1982169061224c845f5260205f2090565b915f5b8181106122865750958360019596971061226e575b505050811b019055565b01515f1960f88460031b161c191690555f8080612264565b9192602060018192868b01518155019401920161224f565b906122ec906122e76001600160a01b03841693845f52600560205260405f206122c7815461148a565b9081612312575b50506001600160a01b03165f52600560205260405f2090565b6121d2565b7f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f45f80a2565b81601f5f93116001146123295750555b5f806122ce565b8183526020832061234591601f0160051c810190600101612122565b808252602082209081548360011b9084198560031b1c191617905555612322565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054146123b55760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81036124605750814710612430575f8080936001600160a01b038294165af161242261301d565b901561242b5750565b613946565b50477fcf479181000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b0392909216602483015260448083019390935291815261019e916124b56064836102a1565b6138d9565b6040517fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10254815f6124ea8361148a565b808352926001811690811561258c575060011461250e575b6106ba925003826102a1565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b8183106125705750509060206106ba92820101612502565b6020919350806001915483858801015201910190918392612558565b602092506106ba94915060ff191682840152151560051b820101612502565b6040517fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354815f6125db8361148a565b808352926001811690811561258c57506001146125fe576106ba925003826102a1565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b8183106126605750509060206106ba92820101612502565b6020919350806001915483858801015201910190918392612648565b9290612686612366565b60208401516001600160a01b0316308103611c8b5750604084015115611c63576126af84612eba565b6126c1815f52600460205260405f2090565b54611c3857610100850180515115611c105780515160208401515103611be8576002546001600160a01b0316806129e4575b506126fd8661397d565b6129c6575b608086019586515195604085019687515103611a62575f5b885180518210156127515761273182602092612b1b565b51015161273f828a51612b1b565b5181811161168257505060010161271a565b5050929550929550926127716116ca6116ca5f546001600160a01b031690565b9360405163680038c760e01b8152602081600481895afa908115610e14575f916129a7575b5060c08501519060ff168082111561299f5750965b60e0850197885151908082106119fd5750506127cd6113525f986117326102d3565b945f5b8951805182101561286657611755826127e892612b1b565b986001600160a01b0381166001600160a01b038b16111561180e5750604051630616556760e41b81526001600160a01b038a16600482015289906020816024818d5afa908115610e14575f91612848575b50156117bc57506001016127d0565b612860915060203d8111610e0d57610dff81836102a1565b5f612839565b50509450949290955061288391965061185e611352338688612b2f565b604051630b1f76cf60e11b81526001600160a01b03821660048201529091602090829060249082905afa908115610e14575f91612980575b501580612978575b6119a35750436128d56118b583612eba565b556128e1835151612ac0565b935f5b84515181101561291957806128fd87600193878761312e565b6129078289612b1b565b526129128188612b1b565b50016128e4565b50935061292b925061191d8282613391565b7f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e05f80a261019e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5060016128c3565b612999915060203d602011610e0d57610dff81836102a1565b5f6128bb565b9050966127ab565b6129c0915060203d602011611a5b57611a4d81836102a1565b5f612796565b606086015142811115611ad75750825142811115611aa85750612702565b95925f9592959491945b85518051821015612a955781612a0391612b1b565b5190612a1f611b58611b4160208501516001600160a01b031690565b918251612a32575b5060019150016129ee565b612a446001600160a01b038b166116ca565b92833b1561018f57612a6e935f92604051809681948293631001f1c560e21b8452600484016130f4565b03915afa918215610e145760019215612a275780611bcd5f612a8f936102a1565b5f612a27565b5050929550929390935f6126f3565b5f5b828110612ab257505050565b606082820152602001612aa6565b9061019e612acd83610882565b612ada60405191826102a1565b83815260208194612aed601f1991610882565b019101612aa4565b634e487b7160e01b5f52603260045260245ffd5b805115612b165760200190565b612af5565b8051821015612b165760209160051b010190565b9190612b3a90612eba565b92825193602084015194612b4e8651611458565b935f5b8751811015612b805780612b676001928a612b1b565b5160208151910120612b798289612b1b565b5201612b51565b509194611f8f939650612bb260406120ae93968151612ba7816120ae602082018095613483565b5190209201516134b0565b9060405195869460208601988991926001600160a01b0360a094979695929760c08501987fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f86526020860152166040840152606083015260808201520152565b6001600160a01b03168015612c5957806001600160a01b031960035416176003557facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde105f80a2565b7f1793862f000000000000000000000000000000000000000000000000000000005f5260045ffd5b612c896134f9565b612c916134f9565b80519067ffffffffffffffff821161026457612cd682612cd17fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025461148a565b612138565b602090601f8311600114612d80579180612d0992612d3095945f9261222e5750508160011b915f199060031b1c19161790565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10255613550565b612d585f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10055565b61019e5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10155565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f52601f19831691907f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d925f5b818110612e2d5750916001939185612d3097969410612e15575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10255613550565b01515f1960f88460031b161c191690555f8080612de8565b92936020600181928786015181550195019301612dce565b9491926001600160a01b03610100979481612eb097949c9b9a9c7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea68a521660208901521660408701526060860152608085015260a084015261012060c08401526101208301906105eb565b9460e08201520152565b6001600160a01b038151166001600160a01b0360208301511692604083015191606084015192608085015195612ef08751611458565b945f5b8851811015612f915780896120ae612f7d6020612f2d85612f27612f1960019988612b1b565b51516001600160a01b031690565b95612b1b565b510151604051928391602083019586604090939291936001600160a01b0360608201957fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da483521660208201520152565b519020612f8a828a612b1b565b5201612ef3565b50909295611f8f9497506120ae9295604051612fb5816120ae602082018095613483565b51902060a082015190612fd161010060c08501519401516136c3565b93604051988997602089019b8c612e45565b81519190604183036130135761300c9250602082015190606060408401519301515f1a90613857565b9192909190565b50505f9160029190565b3d15613047573d9061302e826102e2565b9161303c60405193846102a1565b82523d5f602084013e565b606090565b60ff81511682526001600160a01b036020820151166020830152606061308160408301516080604086015260808501906105eb565b910151916060818303910152815180825260208201916020808360051b8301019401925f915b8383106130b657505050505090565b90919293946020806130e5600193601f198682030187526040838b5180518452015191818582015201906105eb565b970193019301919392906130a7565b909161310b6106ba9360408452604084019061304c565b9160208184039101526105eb565b9081602091031261018f57516106ba816109a2565b92919061314b61314383610100870151612b1b565b515160ff1690565b9360ff8516801580156131da575b6131cb57600181146131bc57600281146131ad576004146131a3577f3bb38fe2000000000000000000000000000000000000000000000000000000005f5260ff851660045260245ffd5b6106ba9450614749565b50909192506106ba935061428e565b50909192506106ba935061400c565b50909192506106ba9350613b91565b5060038114613159565b9291926131f082610882565b936131fe60405195866102a1565b606060208685815201930282019181831161018f57925b8284106132225750505050565b60608483031261018f57602060609160405161323d81610285565b86516132488161017e565b8152828701518382015260408701516132608161017e565b6040820152815201930192613215565b9080601f8301121561018f5781516106ba926020016131e4565b60208183031261018f5780519067ffffffffffffffff821161018f570160808183031261018f57604051916132be83610248565b8151835260208201516020840152604082015167ffffffffffffffff811161018f57820181601f8201121561018f5780516132f881610882565b9161330660405193846102a1565b81835260208084019260061b8201019084821161018f57602001915b818310613357575050506040840152606082015167ffffffffffffffff811161018f5761334f9201613270565b606082015290565b60408386031261018f576020604091825161337181610269565b855161337c8161017e565b81528286015183820152815201920191613322565b9190916101008101600360ff6133aa6131438451612b09565b1614613450575b50906133c482516001600160a01b031690565b906133e0826133db6001546001600160a01b031690565b6148db565b93610348915f5b608086015180518210156134465781613407612f19608094600194612b1b565b896001600160a01b0382168803613423575b50500190506133e7565b61343f916134358460408a0151612b1b565b51908a3391614948565b5f89613419565b5050945050505050565b604061345f6134719251612b09565b5101516020808251830101910161328a565b51461461347e575f6133b1565b509050565b80516020909101905f5b81811061349a5750505090565b825184526020938401939092019160010161348d565b6040516020810181819360208151939101925f5b8181106134e0575050611f8f925003601f1981018352826102a1565b84518352602094850194869450909201916001016134c4565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561352857565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b90815167ffffffffffffffff8111610264576135b6816135907fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035461148a565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10361219a565b602092601f8211600114613609576135e5929382915f9261222e5750508160011b915f199060031b1c19161790565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10355565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f52601f198216937f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75915f5b8681106136ab5750836001959610613693575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10355565b01515f1960f88460031b161c191690555f8080613669565b91926020600181928685015181550194019201613656565b6136cd8151611458565b905f5b8151811015613840576136e38183612b1b565b519060ff825116936001600160a01b03602084015116946060604085015160208151910120940151936137168551611458565b955f5b86518110156137a5578061372f60019289612b1b565b51516120ae6137916020613743858d612b1b565b510151602081519101206040519283916020830195866040909392919360608101947fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df825260208201520152565b51902061379e828b612b1b565b5201613719565b50979560019550966120ae613829929394986040516137cc816120ae602082018095613483565b519020604051948593602085019788909493926001600160a01b0360809360ff60a08501987fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3865216602085015216604083015260608201520152565b5190206138368286612b1b565b52019290926136d0565b5050604051611f8f816120ae602082018095613483565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116138ce579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610e14575f516001600160a01b038116156138c457905f905f90565b505f906001905f90565b5050505f9160039190565b905f602091828151910182855af11561157f575f513d61393d57506001600160a01b0381163b155b6139085750565b6001600160a01b03907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b60011415613901565b80511561395557805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101000151805115612b165760200151600360ff825116036139b65760406139b09101516020808251830101910161328a565b51461490565b50600190565b5160405160208101917f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e8352604082015260408152611f8f6060826102a1565b6106ba91613a0991612fe3565b90929192614acd565b81601f8201121561018f57805190613a29826102e2565b92613a3760405194856102a1565b8284526020838301011161018f57815f9260208093018386015e8301015290565b60208183031261018f5780519067ffffffffffffffff821161018f57019060608282031261018f5760405191613a8d83610285565b8051613a988161017e565b8352602081015167ffffffffffffffff811161018f5782613aba918301613a12565b602084015260408101519067ffffffffffffffff821161018f57019080601f8301121561018f578151613aec81610882565b92613afa60405194856102a1565b81845260208085019260051b82010192831161018f57602001905b828210613b2757505050604082015290565b8151815260209182019101613b15565b613b4d6106ba949260608352606083019061304c565b92602082015260408184039101526105eb565b60405190613b6f6020836102a1565b5f80835261019e9060208401612aa4565b9060206106ba92818152019061060f565b929190610100840191613ba5818451612b1b565b5191613bbe60408401516020808251830101910161328a565b956020820192613be2613bd2828651612b1b565b5160208082518301019101613a58565b95600360ff613bf2885160ff1690565b1603613f8b57600190515111613f6357613c0c8689614c06565b6001546001600160a01b0316613c376020870191613c3183516001600160a01b031690565b906148db565b9089514614613edc575b5050613c4c88614d0d565b93613c5683612eba565b613c7883613c716116ca6116ca8c516001600160a01b031690565b9351612b1b565b51823b1561018f57613cbe925f92838a604051968795869485937ffd93eba600000000000000000000000000000000000000000000000000000000855260048501613b37565b03925af18015610e1457613ec8575b506060880192613cde845151612ac0565b9860204691015114613cf4575b50505050505050565b613d078499989394979596975151611458565b9660405f9601955b8a518051821015613e7b5781613d2491612b1b565b51613d3f30613d3a83516001600160a01b031690565b614d72565b613d49838b612b1b565b5190818110613e485790613d5c9161158a565b613d66838c612b1b565b52613d72828951612b1b565b5180613d7e848d612b1b565b5110613e04575090613dc3828b613dbc84613db66040613da7600199516001600160a01b031690565b9501516001600160a01b031690565b92612b1b565b51916123dd565b6120ae613de8613dd3838d612b1b565b51604051928391602083019190602083019252565b613df2828d612b1b565b52613dfd818c612b1b565b5001613d0f565b610de29083613e13818e612b1b565b517ff0a43aa7000000000000000000000000000000000000000000000000000000005f52600491909152602452604452606490565b7ff5ad5ab7000000000000000000000000000000000000000000000000000000005f52600484905260245260445260645ffd5b505091945091969750613ea99450613eb7613e99613ebc9794612eba565b9360405196879160208301613b80565b03601f1981018752866102a1565b614e1c565b5f808080808080613ceb565b80611bcd5f613ed6936102a1565b5f613ccd565b969591949098935f989360408601995b8a518051821015613f4f5790613f498d8c613f0984600196612b1b565b518d6020613f40613f32613f2485516001600160a01b031690565b95516001600160a01b031690565b92516001600160a01b031690565b92015192614948565b01613eec565b505093985093985093909495505f80613c41565b7f376fce59000000000000000000000000000000000000000000000000000000005f5260045ffd5b50613f968689614b94565b613c0c565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f5760405191613fd083610269565b8051835260208101519067ffffffffffffffff821161018f57019080601f8301121561018f578151614004926020016131e4565b602082015290565b9092919261401f84610100840151612b1b565b5191614038604084015160208082518301019101613f9b565b9361405161404a876020860151612b1b565b5186614f3c565b6001546001600160a01b0316936140776020820195613c3187516001600160a01b031690565b9660205f9701965b875180518210156140d557906140cf8a61409b83600195612b1b565b5180516001600160a01b0316906140b98c516001600160a01b031690565b6020613f4060408401516001600160a01b031690565b0161407f565b50509296509290945061019e93506140f46140ee613b60565b96612eba565b906140fd61143d565b93614e1c565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f576040519161413883610269565b8051835260208101519067ffffffffffffffff821161018f570181601f8201121561018f5780519061416982610882565b9261417760405194856102a1565b82845260208085019360051b8301019181831161018f5760208101935b8385106141a8575050505050602082015290565b845167ffffffffffffffff811161018f5782016060818503601f19011261018f57604051916141d683610285565b60208201516141e48161017e565b835260408201519267ffffffffffffffff841161018f5760608361420f886020809881980101613a12565b8584015201516040820152815201940193614194565b9080602083519182815201916020808360051b8301019401925f915b83831061425057505050505090565b909192939460208061426e600193601f1986820301875289516105eb565b97019301930191939290614241565b9060206106ba928181520190614225565b9290926142a083610100830151612b1b565b51916142b9604084015160208082518301019101614103565b9260206142c98682890151612b1b565b51946142ea828401966142e388516001600160a01b031690565b9083614fee565b01946142f7865151612ac0565b965f5b8751805182101561436b579061434f61431582600194612b1b565b5183546001600160a01b0316906143338b516001600160a01b031690565b81516001600160a01b031690604060208401519301519361504c565b614359828c612b1b565b52614364818b612b1b565b50016142fa565b505091936143809193965061019e9550612eba565b9060405193613eb785613ea98a6020830161427d565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f57604051916143cb83610269565b8051835260208101519067ffffffffffffffff821161018f57019080601f8301121561018f5781516143fc81610882565b9261440a60405194856102a1565b81845260208085019260051b8201019183831161018f5760208201905b83821061443b575050505050602082015290565b815167ffffffffffffffff811161018f5760209161445e87848094880101613a12565b815201910190614427565b60208183031261018f5780519067ffffffffffffffff821161018f57019060808282031261018f576040519161449e83610248565b80516144a98161017e565b83526020810151602084015260408101517fffffffff000000000000000000000000000000000000000000000000000000008116810361018f57604084015260608101519067ffffffffffffffff821161018f57019080601f8301121561018f5781519161451683610882565b9261452460405194856102a1565b80845260208085019160051b8301019183831161018f5760208101915b838310614555575050505050606082015290565b825167ffffffffffffffff811161018f578201906060828703601f19011261018f576040519061458482610285565b6020830151600281101561018f57825260408301519167ffffffffffffffff831161018f576145cb6060856145c18b602080999881990101613a12565b868501520161155e565b6040820152815201920191614541565b9060208282031261018f57815167ffffffffffffffff811161018f576106ba9201613a12565b9080602083519182815201916020808360051b8301019401925f915b83831061462c57505050505090565b909192939460208061464a600193601f198682030187528951614225565b9701930193019193929061461d565b93929160608552606060e08601926001600160a01b0381511682880152602081015160808801527fffffffff0000000000000000000000000000000000000000000000000000000060408201511660a0880152015191608060c08701528251809152610100860160206101008360051b8901019401915f5b8181106146f55750505050816146f09186604094036020880152614601565b930152565b9091929460ff19898203018452855190815160028110156120505760019282602093928493526040806147358585015160608786015260608501906105eb565b9301511515910152970194019291016146d1565b929161475a81610100860151612b1b565b5193614773604086015160208082518301019101614396565b9560206147838482870151612b1b565b519761479d828901996142e38b516001600160a01b031690565b01956147aa875151612ac0565b945f5b885180518210156148c457906147d96147c98261482a94612b1b565b5160208082518301019101614469565b5f886147f36116ca6116ca6003546001600160a01b031690565b8c6040518097819482937ff964081d0000000000000000000000000000000000000000000000000000000084528860048501614659565b03915afa928315610e1457600193614884928e925f926148a0575b5061486861485a87546001600160a01b031690565b93516001600160a01b031690565b602061487b83516001600160a01b031690565b9201519361504c565b61488e828a612b1b565b526148998189612b1b565b50016147ad565b6148bd9192503d805f833e6148b581836102a1565b8101906145db565b905f614845565b5050929094975061438091965061019e9550612eba565b906001600160a01b0360246020928260405195869485937f5e07a6e6000000000000000000000000000000000000000000000000000000008552166004840152165afa908115610e14575f9161492f575090565b6106ba915060203d602011610e0d57610dff81836102a1565b9193909290156149be576001600160a01b036149bb948180600154169481604051977ff18d03cc0000000000000000000000000000000000000000000000000000000060208a01521660248801521660448601521660648401526084830152608482526149b660a4836102a1565b615191565b50565b906001600160a01b03918261019e9581604051967f23b872dd000000000000000000000000000000000000000000000000000000006020890152166024870152166044850152606484015260648352614a186084846102a1565b166138d9565b614a266124ba565b8051908115614a36576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100548015614a635790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b614a906125ab565b8051908115614aa0576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101548015614a635790565b614ad681612046565b80614adf575050565b614ae881612046565b60018103614b18577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b614b2181612046565b60028103614b5557507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b80614b61600392612046565b14614b695750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b908151602083015103614bde5781514603614bb25761019e916150c5565b7f611487ba000000000000000000000000000000000000000000000000000000005f524660045260245ffd5b7f3bc78edf000000000000000000000000000000000000000000000000000000005f5260045ffd5b80516020820190815114614bde5781514614159081614d01575b50614bb25781614c2f916150c5565b614c926020614c4b6116ca6116ca5f546001600160a01b031690565b83516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015292839190829081906024820190565b03915afa908115610e14575f91614ce2575b5015614cad5750565b517fdb489af4000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b614cfb915060203d602011610e0d57610dff81836102a1565b5f614ca4565b5146141590505f614c20565b90606082016020614d1f825151611458565b9301514614614d2b5750565b905f5b82518051821015614d6c5790614d5b6001926001600160a01b03614d53843093612b1b565b515116614d72565b614d658287612b1b565b5201614d2e565b50509050565b6001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8103614d9b57503190565b906001600160a01b03602460209260405194859384927f70a082310000000000000000000000000000000000000000000000000000000084521660048301525afa908115610e14575f91614ded575090565b90506020813d602011614e14575b81614e08602093836102a1565b8101031261018f575190565b3d9150614dfb565b93909291935f5b60608201518051821015613ceb5781614e3b91612b1b565b516001600160a01b03602084015116815190602060ff8651169301516040519060c08252614e6c60c083018861304c565b82810360208401528a518152898c8c6040614e966020830151606060208801526060870190614225565b910151936040818303910152602080855192838152019401905f905b808210614f1e575050507fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d393614f0786948594614f1594604060019e9d9c9b9a0152606086015284810360808601528d6105eb565b9083820360a08501526105eb565b0390a401614e23565b9250925092602080600192865181520194019201918c928f92614eb2565b919082514603614bb25751614fc6575f5b60208301518051821015614d6c576040614f6a83614f7993612b1b565b5101516001600160a01b031690565b306001600160a01b03821614614f925750600101614f4d565b7f0b9ab599000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b7f93c58e11000000000000000000000000000000000000000000000000000000005f5260045ffd5b514603614bb25751614fc65761500f816001600160a01b03600154166148db565b156150175750565b6001600160a01b03907fcaec9bac000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b906149b6906040956150ad6150c1966001600160a01b0380978a519889967fff883fcf0000000000000000000000000000000000000000000000000000000060208901521660248701521660448501526080606485015260a48401906105eb565b90608483015203601f1981018452836102a1565b0190565b919060400190606082515193019283515103615169575f5b8351805182101561516257816150f291612b1b565b5160408101516001600160a01b0316308114614f92575060200151615118828551612b1b565b5181811061512a5750506001016150dd565b610de2927f1fef5f33000000000000000000000000000000000000000000000000000000005f52929190606493600452602452604452565b5050915050565b7f1816c202000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f806106ba93602081519101845af46151a861301d565b91906151b45750613946565b815115806151fa575b6151c5575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156151bd56fe608080604052346015576108c6908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80635e07a6e614610126578063f18d03cc146100e25763ff883fcf1461003a575f80fd5b346100de5760803660031901126100de57610053610153565b61005b610169565b906044359067ffffffffffffffff82116100de57366023830112156100de57816004013592610089846101ce565b90610097604051928361017f565b84825236602486860101116100de575f6020866100da9760246100c698018387013784010152606435926103ea565b6040519182916020835260208301906101ea565b0390f35b5f80fd5b346100de5760803660031901126100de576100fb610153565b610103610169565b906044356001600160a01b03811681036100de576101249260643592610243565b005b346100de5760203660031901126100de576020610149610144610153565b61020e565b6040519015158152f35b600435906001600160a01b03821682036100de57565b602435906001600160a01b03821682036100de57565b90601f8019910116810190811067ffffffffffffffff8211176101a157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116101a157601f01601f191660200190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b803b1561023e5761021e8161066d565b6102385761022b906104d8565b610233575f90565b600190565b50600190565b505f90565b929061024e8461066d565b6103205761025b846104d8565b61027b576001600160a01b0384636b94637360e11b5f521660045260245ffd5b919290916001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee036102c957506102c692604051916102b760208461017f565b5f808452366020850137610626565b50565b906102c693926001600160a01b03604051947fa9059cbb00000000000000000000000000000000000000000000000000000000602087015216602485015260448401526044835261031b60648461017f565b61055a565b91926001600160a01b0316803b156100de575f92836064926001600160a01b03948560405198899788967fbeabacc800000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401525af180156103995761038d5750565b5f6103979161017f565b565b6040513d5f823e3d90fd5b81601f820112156100de578051906103bb826101ce565b926103c9604051948561017f565b828452602083830101116100de57815f9260208093018386015e8301015290565b9291906103f68461066d565b61042f57610403846104d8565b610423576001600160a01b0384636b94637360e11b5f521660045260245ffd5b61042c93610626565b90565b926001600160a01b035f81610484968296604051988997889687947f4ae000410000000000000000000000000000000000000000000000000000000086521660048501526060602485015260648401906101ea565b9060448301520393165af1908115610399575f916104a0575090565b90503d805f833e6104b1818361017f565b81016020828203126100de57815167ffffffffffffffff81116100de5761042c92016103a4565b5f809160405160208101907fe75235b80000000000000000000000000000000000000000000000000000000082526004815261051560248261017f565b51915afa3d15610553573d610529816101ce565b90610537604051928361017f565b81523d5f602083013e5b8161054a575090565b60209150511490565b6060610541565b9190915f6040518092635229073f60e01b82526001600160a01b03861660048301528260248301526080604483015281836001600160a01b03826105a1608482018a6101ea565b8360648301520393165af1918215610399575f915f936105d5575b50516105cc5761042c9250610850565b61042c926107f6565b915091503d805f833e6105e8818361017f565b8101906040818303126100de5780519182151583036100de57602082015167ffffffffffffffff81116100de5761061f92016103a4565b915f6105bc565b90925f90604051928391635229073f60e01b83526001600160a01b038716600484015260248301526080604483015281836001600160a01b03826105a1608482018a6101ea565b60205f604051828101906301ffc9a760e01b82526301ffc9a760e01b60248201526024815261069d60448261017f565b519084617530fa903d5f5190836107ea575b50826107e0575b5081610760575b816106c6575090565b602091505f90604051838101906301ffc9a760e01b82527fffffffff000000000000000000000000000000000000000000000000000000007ff44bac89000000000000000000000000000000000000000000000000000000001660248201526024815261073460448261017f565b5191617530fa5f513d82610754575b508161074d575090565b9050151590565b6020111591505f610743565b905060205f604051828101906301ffc9a760e01b82527fffffffff000000000000000000000000000000000000000000000000000000006024820152602481526107ab60448261017f565b519084617530fa5f513d826107d4575b50816107ca575b5015906106bd565b905015155f6107c2565b6020111591505f6107bb565b151591505f6106b6565b6020111592505f6106af565b906108015750610859565b81511580610847575b610812575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b1561080a565b90919061039757505b80511561086857805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea264697066735822122073412de79f18d64fa84e8572f6b96024e534a9585bb249a06156504b82479b5264736f6c634300081c0033a2646970667358221220937e34b078f06ebb3fb78c25a74edf7a3b2ffe7b5b8b6d57866a3475eab0c92664736f6c634300081c0033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00"],"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":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005be86080806040523460aa575f516020615bc85f395f51905f525460ff8160401c16609b576002600160401b03196001600160401b038216016049575b604051615b1990816100af8239f35b6001600160401b0319166001600160401b039081175f516020615bc85f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80603a565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80630fc27cf614610179578063403b5659146101745780634987ed2f1461016f57806355ef9b861461016a5780636ccae05414610165578063715018a61461016057806384b0196e1461015b57806384d44e28146101565780638da5cb5b14610151578063911929df1461014c5780639479591614610147578063950026511461014257806396d45f511461013d5780639c2a2c6e146101385780639f86fded14610133578063a49eacff1461012e578063c0c53b8b14610129578063cbc9104514610124578063e5814ea61461011f578063f2fde38b1461011a578063f77c4791146101155763faa390d70361000e576112aa565b611285565b611258565b611232565b6111f8565b610fbb565b610f55565b610edd565b610eb7565b610e8a565b610e19565b610d68565b610821565b6107dc565b6107b2565b6106bd565b610554565b610478565b610429565b610403565b610344565b6101a0565b6001600160a01b0381160361018f57565b5f80fd5b359061019e8261017e565b565b3461018f57602036600319011261018f576001600160a01b036004356101c58161017e565b6101cd611ebd565b16801561020c57806001600160a01b031960015416176001557f93fa00498c991ad852fbb3361afb0e3507720aa9ff69a8386009b76134a6e6545f80a2005b7f42af048a000000000000000000000000000000000000000000000000000000005f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6080810190811067ffffffffffffffff82111761026457604052565b610234565b6040810190811067ffffffffffffffff82111761026457604052565b6060810190811067ffffffffffffffff82111761026457604052565b90601f8019910116810190811067ffffffffffffffff82111761026457604052565b6040519061019e610120836102a1565b6040519061019e6020836102a1565b67ffffffffffffffff811161026457601f01601f191660200190565b81601f8201121561018f57803590610315826102e2565b9261032360405194856102a1565b8284526020838301011161018f57815f926020809301838601378301015290565b3461018f57604036600319011261018f5760043567ffffffffffffffff811161018f576080600319823603011261018f576040519061038282610248565b80600401356103908161017e565b825260248101359067ffffffffffffffff821161018f576103b9606492600436918401016102fe565b602084015260448101356040840152013560608201526024359067ffffffffffffffff821161018f576103f36100189236906004016102fe565b906112e5565b5f91031261018f57565b3461018f575f36600319011261018f5760206001600160a01b0360015416604051908152f35b3461018f57604036600319011261018f576004356104468161017e565b6001600160a01b0360243591165f52600660205260405f20905f52602052602060ff60405f2054166040519015158152f35b3461018f57606036600319011261018f576004356104958161017e565b6024356104a18161017e565b604435906104ad611ebd565b6104b5612366565b6001600160a01b03811692831561052c576001600160a01b03816104fd857fed2837b80b3489773c5f1ed30dd2884b4c90dbf7b87428ea03c49b24ef59a805956020956123dd565b6040519485521692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b7f54328a09000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461018f575f36600319011261018f5761056c611ebd565b5f6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90602080835192838152019201905f5b81811061062c5750505090565b825184526020938401939092019160010161061f565b919361069b6106ba96949561068d6001600160a01b03947f0f00000000000000000000000000000000000000000000000000000000000000875260e0602088015260e08701906105eb565b9085820360408701526105eb565b9460608401521660808201525f60a082015260c081840391015261060f565b90565b3461018f575f36600319011261018f577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610789575b1561072b576107036124ba565b61070b6125ab565b9061072761071761143d565b6040519384933091469186610642565b0390f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10154156106f6565b3461018f57602036600319011261018f576004355f526004602052602060405f2054604051908152f35b3461018f575f36600319011261018f5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461018f57602036600319011261018f576001600160a01b036004356108468161017e565b165f52600560205261072761086761086e60405f20604051928380926114c2565b03826102a1565b6040519182916020835260208301906105eb565b67ffffffffffffffff81116102645760051b60200190565b81601f8201121561018f578035906108b182610882565b926108bf60405194856102a1565b82845260208085019360061b8301019181831161018f57602001925b8284106108e9575050505090565b60408483031261018f576020604091825161090381610269565b863561090e8161017e565b815282870135838201528152019301926108db565b9080601f8301121561018f57813561093a81610882565b9261094860405194856102a1565b81845260208085019260051b8201019183831161018f5760208201905b83821061097457505050505090565b813567ffffffffffffffff811161018f57602091610997878480948801016102fe565b815201910190610965565b60ff81160361018f57565b9080601f8301121561018f578135916109c583610882565b926109d360405194856102a1565b80845260208085019160051b8301019183831161018f5760208101915b8383106109ff57505050505090565b823567ffffffffffffffff811161018f5782016080818703601f19011261018f5760405190610a2d82610248565b6020810135610a3b816109a2565b82526040810135610a4b8161017e565b6020830152606081013567ffffffffffffffff811161018f57876020610a73928401016102fe565b6040830152608081013567ffffffffffffffff811161018f57602091010186601f8201121561018f57803590610aa882610882565b91610ab660405193846102a1565b80835260208084019160051b8301019189831161018f5760208101915b838310610af1575050505060608201528152602092830192016109f0565b823567ffffffffffffffff811161018f578201906040828d03601f19011261018f5760405190610b2082610269565b6020830135825260408301359167ffffffffffffffff831161018f57610b4e8e6020809695819601016102fe565b83820152815201920191610ad3565b9190916101208184031261018f57610b736102c3565b92610b7d82610193565b8452610b8b60208301610193565b60208501526040820135604085015260608201356060850152608082013567ffffffffffffffff811161018f5781610bc491840161089a565b608085015260a082013567ffffffffffffffff811161018f5781610be99184016102fe565b60a085015260c082013560c085015260e082013567ffffffffffffffff811161018f5781610c18918401610923565b60e085015261010082013567ffffffffffffffff811161018f57610c3c92016109ad565b610100830152565b919060608382031261018f57604051610c5c81610285565b809380358252602081013567ffffffffffffffff811161018f5783610c82918301610923565b602083015260408101359067ffffffffffffffff821161018f57019180601f8401121561018f578235610cb481610882565b93610cc260405195866102a1565b81855260208086019260051b82010192831161018f57602001905b828210610ced5750505060400152565b8135815260209182019101610cdd565b606060031982011261018f5760043567ffffffffffffffff811161018f5781610d2891600401610b5d565b9160243567ffffffffffffffff811161018f5782610d4891600401610c44565b916044359067ffffffffffffffff821161018f576106ba916004016102fe565b3461018f57610d7636610cfd565b5f5460405163d9d8edb960e01b815233600482015291939190602090829060249082906001600160a01b03165afa908115610e14575f91610de5575b506115ab575b7fa7ac57a9000000000000000000000000000000000000000000000000000000005f523360045260245b5ffd5b610e07915060203d602011610e0d575b610dff81836102a1565b81019061156b565b5f610db2565b503d610df5565b61157f565b3461018f57606036600319011261018f5760043567ffffffffffffffff811161018f57610e4a903690600401610c44565b60243567ffffffffffffffff811161018f57602091610e70610e82923690600401610b5d565b60443591610e7d8361017e565b612b2f565b604051908152f35b3461018f57602036600319011261018f57610018600435610eaa8161017e565b610eb2611ebd565b612c12565b3461018f575f36600319011261018f5760206001600160a01b0360035416604051908152f35b3461018f57610eeb36610cfd565b5f5460405163d9d8edb960e01b815233600482015291929190602090829060249082906001600160a01b03165afa908115610e14575f91610f36575b5015610db8576100189261267c565b610f4f915060203d602011610e0d57610dff81836102a1565b5f610f27565b3461018f57602036600319011261018f576001600160a01b03600435610f7a8161017e565b610f82611ebd565b16806001600160a01b031960025416176002557f5f409c1b4d4ea8490b2608a50161c1a08dc17a0656869303e6e51b9fc89f4ef75f80a2005b3461018f57606036600319011261018f57600435610fd88161017e565b60243590610fe58261017e565b604435610ff18161017e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549267ffffffffffffffff61104060ff604087901c1615611032565b1590565b9567ffffffffffffffff1690565b16801590816111f0575b60011490816111e6575b1590816111dd575b506111b5576110c692846110bd600167ffffffffffffffff197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b61115057611cfa565b6110cc57005b61112168ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6111b06801000000000000000068ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b611cfa565b7ff92ee8a9000000000000000000000000000000000000000000000000000000005f5260045ffd5b9050155f61105c565b303b159150611054565b85915061104a565b3461018f57602036600319011261018f5760043567ffffffffffffffff811161018f5761122c6100189136906004016102fe565b3361229e565b3461018f575f36600319011261018f5760206001600160a01b0360025416604051908152f35b3461018f57602036600319011261018f576100186004356112788161017e565b611280611ebd565b611e02565b3461018f575f36600319011261018f5760206001600160a01b035f5416604051908152f35b3461018f57602036600319011261018f5760043567ffffffffffffffff811161018f57610e826112e06020923690600401610b5d565b612eba565b60608101514281111561140e575080516001600160a01b03169160408201519061133b61133483611327876001600160a01b03165f52600660205260405f2090565b905f5260205260405f2090565b5460ff1690565b6113d45761102e61135d9161135761135286611f1c565b611f95565b86612055565b61139f57829161139761138a60209361132761019e976001600160a01b03165f52600660205260405f2090565b805460ff19166001179055565b01519061229e565b7f3cd453ef000000000000000000000000000000000000000000000000000000005f526001600160a01b03831660045260245ffd5b7fa628820a000000000000000000000000000000000000000000000000000000005f526001600160a01b038416600452602482905260445ffd5b7f59a7ab2d000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b6040519061144c6020836102a1565b5f808352366020840137565b9061146282610882565b61146f60405191826102a1565b8281528092611480601f1991610882565b0190602036910137565b90600182811c921680156114b8575b60208310146114a457565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611499565b5f92918154916114d18361148a565b808352926001811690811561152657506001146114ed57505050565b5f9081526020812093945091925b83831061150c575060209250010190565b6001816020929493945483858701015201910191906114fb565b915050602093945060ff929192191683830152151560051b010190565b9061019e61155792604051938480926114c2565b03836102a1565b5190811515820361018f57565b9081602091031261018f576106ba9061155e565b6040513d5f823e3d90fd5b9190820391821161159757565b634e487b7160e01b5f52601160045260245ffd5b91905a906115b7612366565b60208401516001600160a01b0316308103611c8b5750604084015115611c63576115e084612eba565b6115f2815f52600460205260405f2090565b54611c3857610100850180515115611c105780515160208401515103611be8576002546001600160a01b031680611b06575b5061162e8661397d565b611a8a575b608086019586515195604085019687515103611a62575f5b885180518210156116b05761166282602092612b1b565b510151611670828a51612b1b565b5181811161168257505060010161164b565b7f8ffa61fa000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050856116d66116ca6116ca5f546001600160a01b031690565b6001600160a01b031690565b9360405163680038c760e01b8152602081600481895afa908115610e14575f91611a33575b5060c08501519060ff1680821115611a2b5750965b60e0850197885151908082106119fd57505061173a6113525f986117326102d3565b9081526139bc565b945f5b89518051821015611849576117558261175c92612b1b565b51886139fc565b986001600160a01b0381166001600160a01b038b16111561180e5750604051630616556760e41b81526001600160a01b038a16600482015289906020816024818d5afa908115610e14575f916117f0575b50156117bc575060010161173d565b7ff2470666000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b611808915060203d8111610e0d57610dff81836102a1565b8c6117ad565b7fce98854c000000000000000000000000000000000000000000000000000000005f526001600160a01b03908116600452891660245260445ffd5b5050866118638661185e611352338688612b2f565b6139fc565b604051630b1f76cf60e11b81526001600160a01b03821660048201529091602090829060249082905afa908115610e14575f916119de575b5015806119d7575b6119a35750436118c36118b583612eba565b5f52600460205260405f2090565b556118cf835151612ac0565b935f5b84515181101561190757806118eb87600193878761312e565b6118f58289612b1b565b526119008188612b1b565b50016118d2565b50611924610de2936119789361191d8282613391565b3391612b2f565b7f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e05f80a261197160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5a9061158a565b7fa523ba49000000000000000000000000000000000000000000000000000000005f52600452602490565b7f100158a8000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b505f6118a3565b6119f7915060203d602011610e0d57610dff81836102a1565b8661189b565b7fcd0ce699000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905096611710565b611a55915060203d602011611a5b575b611a4d81836102a1565b810190613119565b886116fb565b503d611a43565b7f9dca1448000000000000000000000000000000000000000000000000000000005f5260045ffd5b606086015142811115611ad75750825142811115611aa85750611633565b7f2c39717b000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b7f95d3dc22000000000000000000000000000000000000000000000000000000005f526004524260245260445ffd5b95925f9592959491945b85518051821015611bd95781611b2591612b1b565b5190611b5d611b58611b4160208501516001600160a01b031690565b6001600160a01b03165f52600560205260405f2090565b611543565b918251611b70575b506001915001611b10565b611b826001600160a01b038b166116ca565b92833b1561018f57611bac935f92604051809681948293631001f1c560e21b8452600484016130f4565b03915afa918215610e145760019215611b655780611bcd5f611bd3936102a1565b806103f9565b5f611b65565b5050929550929390935f611624565b7f95784c9b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fe5dfb56a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f0413dc4a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f58e8d181000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30b078bf000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b60405190611cce6040836102a1565b600182527f31000000000000000000000000000000000000000000000000000000000000006020830152565b611d11611da892611d096134f9565b6112806134f9565b611d196134f9565b611d216134f9565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055611d8e604051611d566040826102a1565b601681527f4d696d69632050726f746f636f6c20536574746c6572000000000000000000006020820152611d88611cbf565b90612c81565b6001600160a01b03166001600160a01b03195f5416175f55565b6040516108e080820182811067ffffffffffffffff821117610264578291615204833903905ff0908115610e1457610eb26001600160a01b0361019e93166001600160a01b03166001600160a01b03196001541617600155565b6001600160a01b03168015611e91576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054826001600160a01b03198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303611ef057565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b6001600160a01b03815116906020810151602081519101209060606040820151910151906040519260208401947f1d67bc34682cf5afae07788c838639fb56351f501a18353e3dd38b5f06c8166a865260408501526060840152608083015260a082015260a08152611f8f60c0826102a1565b51902090565b604290611fa0614a1e565b611fa8614a88565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152611ff960c0826102a1565b51902090604051917f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201522090565b634e487b7160e01b5f52602160045260245ffd5b6004111561205057565b612032565b9190916120628284612fe3565b5060048110156120505715908161210c575b50612104575f926120ae6120bc85946040519283916020830195630b135d3f60e11b875260248401526040604484015260648301906105eb565b03601f1981018352826102a1565b51915afa6120c861301d565b816120f6575b816120d7575090565b905060208180518101031261018f5760200151630b135d3f60e11b1490565b9050602081511015906120ce565b505050600190565b90506001600160a01b038083169116145f612074565b81811061212d575050565b5f8155600101612122565b90601f8211612145575050565b61019e917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f5260205f20906020601f840160051c83019310612190575b601f0160051c0190612122565b9091508190612183565b9190601f81116121a957505050565b61019e925f5260205f20906020601f840160051c8301931061219057601f0160051c0190612122565b919091825167ffffffffffffffff8111610264576121fa816121f4845461148a565b8461219a565b6020601f821160011461223957819061222a9394955f9261222e575b50508160011b915f199060031b1c19161790565b9055565b015190505f80612216565b601f1982169061224c845f5260205f2090565b915f5b8181106122865750958360019596971061226e575b505050811b019055565b01515f1960f88460031b161c191690555f8080612264565b9192602060018192868b01518155019401920161224f565b906122ec906122e76001600160a01b03841693845f52600560205260405f206122c7815461148a565b9081612312575b50506001600160a01b03165f52600560205260405f2090565b6121d2565b7f5ac98b81e10e07689d7de8e9ec09900564d65647de8d039328d4cbdf575b28f45f80a2565b81601f5f93116001146123295750555b5f806122ce565b8183526020832061234591601f0160051c810190600101612122565b808252602082209081548360011b9084198560031b1c191617905555612322565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054146123b55760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81036124605750814710612430575f8080936001600160a01b038294165af161242261301d565b901561242b5750565b613946565b50477fcf479181000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b0392909216602483015260448083019390935291815261019e916124b56064836102a1565b6138d9565b6040517fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10254815f6124ea8361148a565b808352926001811690811561258c575060011461250e575b6106ba925003826102a1565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b8183106125705750509060206106ba92820101612502565b6020919350806001915483858801015201910190918392612558565b602092506106ba94915060ff191682840152151560051b820101612502565b6040517fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354815f6125db8361148a565b808352926001811690811561258c57506001146125fe576106ba925003826102a1565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b8183106126605750509060206106ba92820101612502565b6020919350806001915483858801015201910190918392612648565b9290612686612366565b60208401516001600160a01b0316308103611c8b5750604084015115611c63576126af84612eba565b6126c1815f52600460205260405f2090565b54611c3857610100850180515115611c105780515160208401515103611be8576002546001600160a01b0316806129e4575b506126fd8661397d565b6129c6575b608086019586515195604085019687515103611a62575f5b885180518210156127515761273182602092612b1b565b51015161273f828a51612b1b565b5181811161168257505060010161271a565b5050929550929550926127716116ca6116ca5f546001600160a01b031690565b9360405163680038c760e01b8152602081600481895afa908115610e14575f916129a7575b5060c08501519060ff168082111561299f5750965b60e0850197885151908082106119fd5750506127cd6113525f986117326102d3565b945f5b8951805182101561286657611755826127e892612b1b565b986001600160a01b0381166001600160a01b038b16111561180e5750604051630616556760e41b81526001600160a01b038a16600482015289906020816024818d5afa908115610e14575f91612848575b50156117bc57506001016127d0565b612860915060203d8111610e0d57610dff81836102a1565b5f612839565b50509450949290955061288391965061185e611352338688612b2f565b604051630b1f76cf60e11b81526001600160a01b03821660048201529091602090829060249082905afa908115610e14575f91612980575b501580612978575b6119a35750436128d56118b583612eba565b556128e1835151612ac0565b935f5b84515181101561291957806128fd87600193878761312e565b6129078289612b1b565b526129128188612b1b565b50016128e4565b50935061292b925061191d8282613391565b7f7b1bcf1ccf901a11589afff5504d59fd0a53780eed2a952adade0348985139e05f80a261019e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5060016128c3565b612999915060203d602011610e0d57610dff81836102a1565b5f6128bb565b9050966127ab565b6129c0915060203d602011611a5b57611a4d81836102a1565b5f612796565b606086015142811115611ad75750825142811115611aa85750612702565b95925f9592959491945b85518051821015612a955781612a0391612b1b565b5190612a1f611b58611b4160208501516001600160a01b031690565b918251612a32575b5060019150016129ee565b612a446001600160a01b038b166116ca565b92833b1561018f57612a6e935f92604051809681948293631001f1c560e21b8452600484016130f4565b03915afa918215610e145760019215612a275780611bcd5f612a8f936102a1565b5f612a27565b5050929550929390935f6126f3565b5f5b828110612ab257505050565b606082820152602001612aa6565b9061019e612acd83610882565b612ada60405191826102a1565b83815260208194612aed601f1991610882565b019101612aa4565b634e487b7160e01b5f52603260045260245ffd5b805115612b165760200190565b612af5565b8051821015612b165760209160051b010190565b9190612b3a90612eba565b92825193602084015194612b4e8651611458565b935f5b8751811015612b805780612b676001928a612b1b565b5160208151910120612b798289612b1b565b5201612b51565b509194611f8f939650612bb260406120ae93968151612ba7816120ae602082018095613483565b5190209201516134b0565b9060405195869460208601988991926001600160a01b0360a094979695929760c08501987fa3fe6f3f3735a89666b95c43900391e47561d7b498410df539101e55309a968f86526020860152166040840152606083015260808201520152565b6001600160a01b03168015612c5957806001600160a01b031960035416176003557facfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde105f80a2565b7f1793862f000000000000000000000000000000000000000000000000000000005f5260045ffd5b612c896134f9565b612c916134f9565b80519067ffffffffffffffff821161026457612cd682612cd17fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025461148a565b612138565b602090601f8311600114612d80579180612d0992612d3095945f9261222e5750508160011b915f199060031b1c19161790565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10255613550565b612d585f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10055565b61019e5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10155565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f52601f19831691907f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d925f5b818110612e2d5750916001939185612d3097969410612e15575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10255613550565b01515f1960f88460031b161c191690555f8080612de8565b92936020600181928786015181550195019301612dce565b9491926001600160a01b03610100979481612eb097949c9b9a9c7f7d91aa1f7591f1c332ec5a25ed7cf5b18b014aff05605580d4bb8c353714eea68a521660208901521660408701526060860152608085015260a084015261012060c08401526101208301906105eb565b9460e08201520152565b6001600160a01b038151166001600160a01b0360208301511692604083015191606084015192608085015195612ef08751611458565b945f5b8851811015612f915780896120ae612f7d6020612f2d85612f27612f1960019988612b1b565b51516001600160a01b031690565b95612b1b565b510151604051928391602083019586604090939291936001600160a01b0360608201957fe44101eb81f50b64d4005e31312ea7bafd6f81357f9dce4fe51d5f2dcb939da483521660208201520152565b519020612f8a828a612b1b565b5201612ef3565b50909295611f8f9497506120ae9295604051612fb5816120ae602082018095613483565b51902060a082015190612fd161010060c08501519401516136c3565b93604051988997602089019b8c612e45565b81519190604183036130135761300c9250602082015190606060408401519301515f1a90613857565b9192909190565b50505f9160029190565b3d15613047573d9061302e826102e2565b9161303c60405193846102a1565b82523d5f602084013e565b606090565b60ff81511682526001600160a01b036020820151166020830152606061308160408301516080604086015260808501906105eb565b910151916060818303910152815180825260208201916020808360051b8301019401925f915b8383106130b657505050505090565b90919293946020806130e5600193601f198682030187526040838b5180518452015191818582015201906105eb565b970193019301919392906130a7565b909161310b6106ba9360408452604084019061304c565b9160208184039101526105eb565b9081602091031261018f57516106ba816109a2565b92919061314b61314383610100870151612b1b565b515160ff1690565b9360ff8516801580156131da575b6131cb57600181146131bc57600281146131ad576004146131a3577f3bb38fe2000000000000000000000000000000000000000000000000000000005f5260ff851660045260245ffd5b6106ba9450614749565b50909192506106ba935061428e565b50909192506106ba935061400c565b50909192506106ba9350613b91565b5060038114613159565b9291926131f082610882565b936131fe60405195866102a1565b606060208685815201930282019181831161018f57925b8284106132225750505050565b60608483031261018f57602060609160405161323d81610285565b86516132488161017e565b8152828701518382015260408701516132608161017e565b6040820152815201930192613215565b9080601f8301121561018f5781516106ba926020016131e4565b60208183031261018f5780519067ffffffffffffffff821161018f570160808183031261018f57604051916132be83610248565b8151835260208201516020840152604082015167ffffffffffffffff811161018f57820181601f8201121561018f5780516132f881610882565b9161330660405193846102a1565b81835260208084019260061b8201019084821161018f57602001915b818310613357575050506040840152606082015167ffffffffffffffff811161018f5761334f9201613270565b606082015290565b60408386031261018f576020604091825161337181610269565b855161337c8161017e565b81528286015183820152815201920191613322565b9190916101008101600360ff6133aa6131438451612b09565b1614613450575b50906133c482516001600160a01b031690565b906133e0826133db6001546001600160a01b031690565b6148db565b93610348915f5b608086015180518210156134465781613407612f19608094600194612b1b565b896001600160a01b0382168803613423575b50500190506133e7565b61343f916134358460408a0151612b1b565b51908a3391614948565b5f89613419565b5050945050505050565b604061345f6134719251612b09565b5101516020808251830101910161328a565b51461461347e575f6133b1565b509050565b80516020909101905f5b81811061349a5750505090565b825184526020938401939092019160010161348d565b6040516020810181819360208151939101925f5b8181106134e0575050611f8f925003601f1981018352826102a1565b84518352602094850194869450909201916001016134c4565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561352857565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b90815167ffffffffffffffff8111610264576135b6816135907fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035461148a565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10361219a565b602092601f8211600114613609576135e5929382915f9261222e5750508160011b915f199060031b1c19161790565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10355565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f52601f198216937f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75915f5b8681106136ab5750836001959610613693575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10355565b01515f1960f88460031b161c191690555f8080613669565b91926020600181928685015181550194019201613656565b6136cd8151611458565b905f5b8151811015613840576136e38183612b1b565b519060ff825116936001600160a01b03602084015116946060604085015160208151910120940151936137168551611458565b955f5b86518110156137a5578061372f60019289612b1b565b51516120ae6137916020613743858d612b1b565b510151602081519101206040519283916020830195866040909392919360608101947fcf6ba9f1afa971013ec5a00408cf423b65abc1de93e4b7dd80f4fa6f07f193df825260208201520152565b51902061379e828b612b1b565b5201613719565b50979560019550966120ae613829929394986040516137cc816120ae602082018095613483565b519020604051948593602085019788909493926001600160a01b0360809360ff60a08501987fb50234482bc32bb6c761550484098f7c231b0a3e3180699a836f6241d1029de3865216602085015216604083015260608201520152565b5190206138368286612b1b565b52019290926136d0565b5050604051611f8f816120ae602082018095613483565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116138ce579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610e14575f516001600160a01b038116156138c457905f905f90565b505f906001905f90565b5050505f9160039190565b905f602091828151910182855af11561157f575f513d61393d57506001600160a01b0381163b155b6139085750565b6001600160a01b03907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b60011415613901565b80511561395557805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101000151805115612b165760200151600360ff825116036139b65760406139b09101516020808251830101910161328a565b51461490565b50600190565b5160405160208101917f07094367b2db06e3dbb414cf947644f8e08067ea238c5f41cb2fa5fea5be628e8352604082015260408152611f8f6060826102a1565b6106ba91613a0991612fe3565b90929192614acd565b81601f8201121561018f57805190613a29826102e2565b92613a3760405194856102a1565b8284526020838301011161018f57815f9260208093018386015e8301015290565b60208183031261018f5780519067ffffffffffffffff821161018f57019060608282031261018f5760405191613a8d83610285565b8051613a988161017e565b8352602081015167ffffffffffffffff811161018f5782613aba918301613a12565b602084015260408101519067ffffffffffffffff821161018f57019080601f8301121561018f578151613aec81610882565b92613afa60405194856102a1565b81845260208085019260051b82010192831161018f57602001905b828210613b2757505050604082015290565b8151815260209182019101613b15565b613b4d6106ba949260608352606083019061304c565b92602082015260408184039101526105eb565b60405190613b6f6020836102a1565b5f80835261019e9060208401612aa4565b9060206106ba92818152019061060f565b929190610100840191613ba5818451612b1b565b5191613bbe60408401516020808251830101910161328a565b956020820192613be2613bd2828651612b1b565b5160208082518301019101613a58565b95600360ff613bf2885160ff1690565b1603613f8b57600190515111613f6357613c0c8689614c06565b6001546001600160a01b0316613c376020870191613c3183516001600160a01b031690565b906148db565b9089514614613edc575b5050613c4c88614d0d565b93613c5683612eba565b613c7883613c716116ca6116ca8c516001600160a01b031690565b9351612b1b565b51823b1561018f57613cbe925f92838a604051968795869485937ffd93eba600000000000000000000000000000000000000000000000000000000855260048501613b37565b03925af18015610e1457613ec8575b506060880192613cde845151612ac0565b9860204691015114613cf4575b50505050505050565b613d078499989394979596975151611458565b9660405f9601955b8a518051821015613e7b5781613d2491612b1b565b51613d3f30613d3a83516001600160a01b031690565b614d72565b613d49838b612b1b565b5190818110613e485790613d5c9161158a565b613d66838c612b1b565b52613d72828951612b1b565b5180613d7e848d612b1b565b5110613e04575090613dc3828b613dbc84613db66040613da7600199516001600160a01b031690565b9501516001600160a01b031690565b92612b1b565b51916123dd565b6120ae613de8613dd3838d612b1b565b51604051928391602083019190602083019252565b613df2828d612b1b565b52613dfd818c612b1b565b5001613d0f565b610de29083613e13818e612b1b565b517ff0a43aa7000000000000000000000000000000000000000000000000000000005f52600491909152602452604452606490565b7ff5ad5ab7000000000000000000000000000000000000000000000000000000005f52600484905260245260445260645ffd5b505091945091969750613ea99450613eb7613e99613ebc9794612eba565b9360405196879160208301613b80565b03601f1981018752866102a1565b614e1c565b5f808080808080613ceb565b80611bcd5f613ed6936102a1565b5f613ccd565b969591949098935f989360408601995b8a518051821015613f4f5790613f498d8c613f0984600196612b1b565b518d6020613f40613f32613f2485516001600160a01b031690565b95516001600160a01b031690565b92516001600160a01b031690565b92015192614948565b01613eec565b505093985093985093909495505f80613c41565b7f376fce59000000000000000000000000000000000000000000000000000000005f5260045ffd5b50613f968689614b94565b613c0c565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f5760405191613fd083610269565b8051835260208101519067ffffffffffffffff821161018f57019080601f8301121561018f578151614004926020016131e4565b602082015290565b9092919261401f84610100840151612b1b565b5191614038604084015160208082518301019101613f9b565b9361405161404a876020860151612b1b565b5186614f3c565b6001546001600160a01b0316936140776020820195613c3187516001600160a01b031690565b9660205f9701965b875180518210156140d557906140cf8a61409b83600195612b1b565b5180516001600160a01b0316906140b98c516001600160a01b031690565b6020613f4060408401516001600160a01b031690565b0161407f565b50509296509290945061019e93506140f46140ee613b60565b96612eba565b906140fd61143d565b93614e1c565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f576040519161413883610269565b8051835260208101519067ffffffffffffffff821161018f570181601f8201121561018f5780519061416982610882565b9261417760405194856102a1565b82845260208085019360051b8301019181831161018f5760208101935b8385106141a8575050505050602082015290565b845167ffffffffffffffff811161018f5782016060818503601f19011261018f57604051916141d683610285565b60208201516141e48161017e565b835260408201519267ffffffffffffffff841161018f5760608361420f886020809881980101613a12565b8584015201516040820152815201940193614194565b9080602083519182815201916020808360051b8301019401925f915b83831061425057505050505090565b909192939460208061426e600193601f1986820301875289516105eb565b97019301930191939290614241565b9060206106ba928181520190614225565b9290926142a083610100830151612b1b565b51916142b9604084015160208082518301019101614103565b9260206142c98682890151612b1b565b51946142ea828401966142e388516001600160a01b031690565b9083614fee565b01946142f7865151612ac0565b965f5b8751805182101561436b579061434f61431582600194612b1b565b5183546001600160a01b0316906143338b516001600160a01b031690565b81516001600160a01b031690604060208401519301519361504c565b614359828c612b1b565b52614364818b612b1b565b50016142fa565b505091936143809193965061019e9550612eba565b9060405193613eb785613ea98a6020830161427d565b60208183031261018f5780519067ffffffffffffffff821161018f57019060408282031261018f57604051916143cb83610269565b8051835260208101519067ffffffffffffffff821161018f57019080601f8301121561018f5781516143fc81610882565b9261440a60405194856102a1565b81845260208085019260051b8201019183831161018f5760208201905b83821061443b575050505050602082015290565b815167ffffffffffffffff811161018f5760209161445e87848094880101613a12565b815201910190614427565b60208183031261018f5780519067ffffffffffffffff821161018f57019060808282031261018f576040519161449e83610248565b80516144a98161017e565b83526020810151602084015260408101517fffffffff000000000000000000000000000000000000000000000000000000008116810361018f57604084015260608101519067ffffffffffffffff821161018f57019080601f8301121561018f5781519161451683610882565b9261452460405194856102a1565b80845260208085019160051b8301019183831161018f5760208101915b838310614555575050505050606082015290565b825167ffffffffffffffff811161018f578201906060828703601f19011261018f576040519061458482610285565b6020830151600281101561018f57825260408301519167ffffffffffffffff831161018f576145cb6060856145c18b602080999881990101613a12565b868501520161155e565b6040820152815201920191614541565b9060208282031261018f57815167ffffffffffffffff811161018f576106ba9201613a12565b9080602083519182815201916020808360051b8301019401925f915b83831061462c57505050505090565b909192939460208061464a600193601f198682030187528951614225565b9701930193019193929061461d565b93929160608552606060e08601926001600160a01b0381511682880152602081015160808801527fffffffff0000000000000000000000000000000000000000000000000000000060408201511660a0880152015191608060c08701528251809152610100860160206101008360051b8901019401915f5b8181106146f55750505050816146f09186604094036020880152614601565b930152565b9091929460ff19898203018452855190815160028110156120505760019282602093928493526040806147358585015160608786015260608501906105eb565b9301511515910152970194019291016146d1565b929161475a81610100860151612b1b565b5193614773604086015160208082518301019101614396565b9560206147838482870151612b1b565b519761479d828901996142e38b516001600160a01b031690565b01956147aa875151612ac0565b945f5b885180518210156148c457906147d96147c98261482a94612b1b565b5160208082518301019101614469565b5f886147f36116ca6116ca6003546001600160a01b031690565b8c6040518097819482937ff964081d0000000000000000000000000000000000000000000000000000000084528860048501614659565b03915afa928315610e1457600193614884928e925f926148a0575b5061486861485a87546001600160a01b031690565b93516001600160a01b031690565b602061487b83516001600160a01b031690565b9201519361504c565b61488e828a612b1b565b526148998189612b1b565b50016147ad565b6148bd9192503d805f833e6148b581836102a1565b8101906145db565b905f614845565b5050929094975061438091965061019e9550612eba565b906001600160a01b0360246020928260405195869485937f5e07a6e6000000000000000000000000000000000000000000000000000000008552166004840152165afa908115610e14575f9161492f575090565b6106ba915060203d602011610e0d57610dff81836102a1565b9193909290156149be576001600160a01b036149bb948180600154169481604051977ff18d03cc0000000000000000000000000000000000000000000000000000000060208a01521660248801521660448601521660648401526084830152608482526149b660a4836102a1565b615191565b50565b906001600160a01b03918261019e9581604051967f23b872dd000000000000000000000000000000000000000000000000000000006020890152166024870152166044850152606484015260648352614a186084846102a1565b166138d9565b614a266124ba565b8051908115614a36576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100548015614a635790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b614a906125ab565b8051908115614aa0576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101548015614a635790565b614ad681612046565b80614adf575050565b614ae881612046565b60018103614b18577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b614b2181612046565b60028103614b5557507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b80614b61600392612046565b14614b695750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b908151602083015103614bde5781514603614bb25761019e916150c5565b7f611487ba000000000000000000000000000000000000000000000000000000005f524660045260245ffd5b7f3bc78edf000000000000000000000000000000000000000000000000000000005f5260045ffd5b80516020820190815114614bde5781514614159081614d01575b50614bb25781614c2f916150c5565b614c926020614c4b6116ca6116ca5f546001600160a01b031690565b83516040517f7d7011020000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015292839190829081906024820190565b03915afa908115610e14575f91614ce2575b5015614cad5750565b517fdb489af4000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b614cfb915060203d602011610e0d57610dff81836102a1565b5f614ca4565b5146141590505f614c20565b90606082016020614d1f825151611458565b9301514614614d2b5750565b905f5b82518051821015614d6c5790614d5b6001926001600160a01b03614d53843093612b1b565b515116614d72565b614d658287612b1b565b5201614d2e565b50509050565b6001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8103614d9b57503190565b906001600160a01b03602460209260405194859384927f70a082310000000000000000000000000000000000000000000000000000000084521660048301525afa908115610e14575f91614ded575090565b90506020813d602011614e14575b81614e08602093836102a1565b8101031261018f575190565b3d9150614dfb565b93909291935f5b60608201518051821015613ceb5781614e3b91612b1b565b516001600160a01b03602084015116815190602060ff8651169301516040519060c08252614e6c60c083018861304c565b82810360208401528a518152898c8c6040614e966020830151606060208801526060870190614225565b910151936040818303910152602080855192838152019401905f905b808210614f1e575050507fb09e51e3f4dd06d21b6df6ec765fb1155b36c6c9b700e07e6a7b1a944c06d8d393614f0786948594614f1594604060019e9d9c9b9a0152606086015284810360808601528d6105eb565b9083820360a08501526105eb565b0390a401614e23565b9250925092602080600192865181520194019201918c928f92614eb2565b919082514603614bb25751614fc6575f5b60208301518051821015614d6c576040614f6a83614f7993612b1b565b5101516001600160a01b031690565b306001600160a01b03821614614f925750600101614f4d565b7f0b9ab599000000000000000000000000000000000000000000000000000000005f526001600160a01b031660045260245ffd5b7f93c58e11000000000000000000000000000000000000000000000000000000005f5260045ffd5b514603614bb25751614fc65761500f816001600160a01b03600154166148db565b156150175750565b6001600160a01b03907fcaec9bac000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b906149b6906040956150ad6150c1966001600160a01b0380978a519889967fff883fcf0000000000000000000000000000000000000000000000000000000060208901521660248701521660448501526080606485015260a48401906105eb565b90608483015203601f1981018452836102a1565b0190565b919060400190606082515193019283515103615169575f5b8351805182101561516257816150f291612b1b565b5160408101516001600160a01b0316308114614f92575060200151615118828551612b1b565b5181811061512a5750506001016150dd565b610de2927f1fef5f33000000000000000000000000000000000000000000000000000000005f52929190606493600452602452604452565b5050915050565b7f1816c202000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f806106ba93602081519101845af46151a861301d565b91906151b45750613946565b815115806151fa575b6151c5575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156151bd56fe608080604052346015576108c6908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80635e07a6e614610126578063f18d03cc146100e25763ff883fcf1461003a575f80fd5b346100de5760803660031901126100de57610053610153565b61005b610169565b906044359067ffffffffffffffff82116100de57366023830112156100de57816004013592610089846101ce565b90610097604051928361017f565b84825236602486860101116100de575f6020866100da9760246100c698018387013784010152606435926103ea565b6040519182916020835260208301906101ea565b0390f35b5f80fd5b346100de5760803660031901126100de576100fb610153565b610103610169565b906044356001600160a01b03811681036100de576101249260643592610243565b005b346100de5760203660031901126100de576020610149610144610153565b61020e565b6040519015158152f35b600435906001600160a01b03821682036100de57565b602435906001600160a01b03821682036100de57565b90601f8019910116810190811067ffffffffffffffff8211176101a157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116101a157601f01601f191660200190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b803b1561023e5761021e8161066d565b6102385761022b906104d8565b610233575f90565b600190565b50600190565b505f90565b929061024e8461066d565b6103205761025b846104d8565b61027b576001600160a01b0384636b94637360e11b5f521660045260245ffd5b919290916001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee036102c957506102c692604051916102b760208461017f565b5f808452366020850137610626565b50565b906102c693926001600160a01b03604051947fa9059cbb00000000000000000000000000000000000000000000000000000000602087015216602485015260448401526044835261031b60648461017f565b61055a565b91926001600160a01b0316803b156100de575f92836064926001600160a01b03948560405198899788967fbeabacc800000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401525af180156103995761038d5750565b5f6103979161017f565b565b6040513d5f823e3d90fd5b81601f820112156100de578051906103bb826101ce565b926103c9604051948561017f565b828452602083830101116100de57815f9260208093018386015e8301015290565b9291906103f68461066d565b61042f57610403846104d8565b610423576001600160a01b0384636b94637360e11b5f521660045260245ffd5b61042c93610626565b90565b926001600160a01b035f81610484968296604051988997889687947f4ae000410000000000000000000000000000000000000000000000000000000086521660048501526060602485015260648401906101ea565b9060448301520393165af1908115610399575f916104a0575090565b90503d805f833e6104b1818361017f565b81016020828203126100de57815167ffffffffffffffff81116100de5761042c92016103a4565b5f809160405160208101907fe75235b80000000000000000000000000000000000000000000000000000000082526004815261051560248261017f565b51915afa3d15610553573d610529816101ce565b90610537604051928361017f565b81523d5f602083013e5b8161054a575090565b60209150511490565b6060610541565b9190915f6040518092635229073f60e01b82526001600160a01b03861660048301528260248301526080604483015281836001600160a01b03826105a1608482018a6101ea565b8360648301520393165af1918215610399575f915f936105d5575b50516105cc5761042c9250610850565b61042c926107f6565b915091503d805f833e6105e8818361017f565b8101906040818303126100de5780519182151583036100de57602082015167ffffffffffffffff81116100de5761061f92016103a4565b915f6105bc565b90925f90604051928391635229073f60e01b83526001600160a01b038716600484015260248301526080604483015281836001600160a01b03826105a1608482018a6101ea565b60205f604051828101906301ffc9a760e01b82526301ffc9a760e01b60248201526024815261069d60448261017f565b519084617530fa903d5f5190836107ea575b50826107e0575b5081610760575b816106c6575090565b602091505f90604051838101906301ffc9a760e01b82527fffffffff000000000000000000000000000000000000000000000000000000007ff44bac89000000000000000000000000000000000000000000000000000000001660248201526024815261073460448261017f565b5191617530fa5f513d82610754575b508161074d575090565b9050151590565b6020111591505f610743565b905060205f604051828101906301ffc9a760e01b82527fffffffff000000000000000000000000000000000000000000000000000000006024820152602481526107ab60448261017f565b519084617530fa5f513d826107d4575b50816107ca575b5015906106bd565b905015155f6107c2565b6020111591505f6107bb565b151591505f6106b6565b6020111592505f6106af565b906108015750610859565b81511580610847575b610812575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b1561080a565b90919061039757505b80511561086857805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea264697066735822122073412de79f18d64fa84e8572f6b96024e534a9585bb249a06156504b82479b5264736f6c634300081c0033a2646970667358221220937e34b078f06ebb3fb78c25a74edf7a3b2ffe7b5b8b6d57866a3475eab0c92664736f6c634300081c0033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00000000000000000000000000000000000000000000000000","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":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x11c7675bf5a47d6c124ed9ed4f640a0e4c018ff3aec63f21b9cee803810ffbd4"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Settler#ICreateX.deployCreate3","hash":"0x11c7675bf5a47d6c124ed9ed4f640a0e4c018ff3aec63f21b9cee803810ffbd4","networkInteractionId":1,"receipt":{"blockHash":"0x7d1cf8aa40b67d970d0228b9217bcdd2baa8de0fabad722873fea25768bac29f","blockNumber":46339718,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":21,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000007691c0b16f0feef4491417e410cbe068a9251430","0xd2d4b016fc4a27d620293ea5601850fcb0de7d018c55fd9acb02984a7541fbc9"]},{"address":"0x8F84Ca9801533CaE282F95924fADb88A3689a34d","data":"0x000000000000000000000000000000000000000000000000ffffffffffffffff","logIndex":22,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":23,"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":"0x609d831C0068844e11eF85a273c7F356212Fd6D1","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x347f2a0e4b16a680bf4de17133f67fcd3064187582909a5b3e2a4300af3dad4e","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3Settler#Settler","contractAddress":"0x609d831C0068844e11eF85a273c7F356212Fd6D1","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":"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":"0x11c7675bf5a47d6c124ed9ed4f640a0e4c018ff3aec63f21b9cee803810ffbd4","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","0x60a060405234610268575f610c2c8038038061001a8161026c565b928339810160608282031261026857610032826102a5565b9061003f602084016102a5565b604084015190936001600160401b038211610268570181601f8201121561026857805161007361006e826102b9565b61026c565b9181835260208301936020838301011161026857815f926020809301865e83010152823b1561024a577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0385169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a280511561023e5784610134939281925190845af43d15610236573d9161012561006e846102b9565b9283523d86602085013e6102d4565b505b604051906104d080830191906001600160401b038311848410176102225791839160209361073c84396001600160a01b0316815203019082f080156102155760018060a01b031690816080525f516020610c0c5f395f51905f5254907f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6040805160018060a01b0385168152856020820152a1821561020157506001600160a01b031916175f516020610c0c5f395f51905f5255604051610409908161033382396080518160070152f35b633173bdd160e11b81526004819052602490fd5b50604051903d90823e3d90fd5b634e487b7160e01b85526041600452602485fd5b6060916102d4565b50505090505f90610136565b634c9c8ce360e01b5f9081526001600160a01b038416600452602490fd5b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761029157604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361026857565b6001600160401b03811161029157601f01601f191660200190565b906102f857508051156102e957805190602001fd5b63d6bda27560e01b5f5260045ffd5b81511580610329575b610309575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561030156fe6080604052337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316036100b0575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100a6577fd2b576ec000000000000000000000000000000000000000000000000000000005f5260045ffd5b6100ae61016b565b005b5f806001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416368280378136915af43d5f803e156100f3573d5ff35b3d5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761014a57604052565b6100f7565b67ffffffffffffffff811161014a57601f01601f191660200190565b366004116101f35760403660031901126101f3576004356001600160a01b0381168091036101f3576024359067ffffffffffffffff82116101f357366023830112156101f3578160040135906101c86101c38361014f565b610124565b9180835236602482860101116101f3576020815f9260246101f1970183870137840101526101f7565b565b5f80fd5b90813b156102d9576001600160a01b038216807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28051156102a8576102a59161030e565b50565b5050346102b157565b7fb398979f000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b03827f4c9c8ce3000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b5f8061034093602081519101845af43d15610343573d916103316101c38461014f565b9283523d5f602085013e610347565b90565b6060915b90610384575080511561035c57805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b815115806103ca575b610395575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b1561038d56fea26469706673582212205fb1ef45360fa87114903ac7ff35f8b50aae4101722212022b0f178738a978ad64736f6c634300081c003360803460b857601f6104d038819003918201601f19168301916001600160401b0383118484101760bc5780849260209460405283398101031260b857516001600160a01b0381169081900360b857801560a5575f80546001600160a01b031981168317825560405192916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36103ff90816100d18239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f5f3560e01c8063715018a6146102e05780638da5cb5b146102bb5780639623609d14610168578063ad3cb1cc146101035763f2fde38b14610051575f80fd5b34610100576020366003190112610100576004356001600160a01b0381168091036100fe5761007e61038a565b80156100d2576001600160a01b0382548273ffffffffffffffffffffffffffffffffffffffff198216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6024827f1e4fbdf700000000000000000000000000000000000000000000000000000000815280600452fd5b505b80fd5b503461010057806003193601126101005750610164604051610126604082610344565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190610366565b0390f35b50606036600319011261028a576004356001600160a01b03811680910361028a576024356001600160a01b03811680910361028a5760443567ffffffffffffffff811161028a573660238201121561028a57806004013567ffffffffffffffff811161028e57604051916101e6601f8301601f191660200184610344565b818352366024838301011161028a57815f92602460209301838601378301015261020e61038a565b823b1561028a5761025d925f926040518095819482937f4f1ef2860000000000000000000000000000000000000000000000000000000084526004840152604060248401526044830190610366565b039134905af1801561027f57610271575080f35b61027d91505f90610344565b005b6040513d5f823e3d90fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b3461028a575f36600319011261028a5760206001600160a01b035f5416604051908152f35b3461028a575f36600319011261028a576102f861038a565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b90601f8019910116810190811067ffffffffffffffff82111761028e57604052565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6001600160a01b035f5416330361039d57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea264697066735822122087ed775a4d6d3ac2f30f3ac551807433be2f1f5c398ad2935bfd3a3586ec9ec464736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c1000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000d69ab273785a2d65719f13eeeea2b46c3e814988000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c10000000000000000000000000183e61bde23a80f4d1e003653288d4b4551681ed00000000000000000000000000000000000000000000000000000000"],"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":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000430260300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000d2c60a060405234610268575f610c2c8038038061001a8161026c565b928339810160608282031261026857610032826102a5565b9061003f602084016102a5565b604084015190936001600160401b038211610268570181601f8201121561026857805161007361006e826102b9565b61026c565b9181835260208301936020838301011161026857815f926020809301865e83010152823b1561024a577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0385169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a280511561023e5784610134939281925190845af43d15610236573d9161012561006e846102b9565b9283523d86602085013e6102d4565b505b604051906104d080830191906001600160401b038311848410176102225791839160209361073c84396001600160a01b0316815203019082f080156102155760018060a01b031690816080525f516020610c0c5f395f51905f5254907f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6040805160018060a01b0385168152856020820152a1821561020157506001600160a01b031916175f516020610c0c5f395f51905f5255604051610409908161033382396080518160070152f35b633173bdd160e11b81526004819052602490fd5b50604051903d90823e3d90fd5b634e487b7160e01b85526041600452602485fd5b6060916102d4565b50505090505f90610136565b634c9c8ce360e01b5f9081526001600160a01b038416600452602490fd5b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761029157604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361026857565b6001600160401b03811161029157601f01601f191660200190565b906102f857508051156102e957805190602001fd5b63d6bda27560e01b5f5260045ffd5b81511580610329575b610309575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561030156fe6080604052337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316036100b0575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef28600000000000000000000000000000000000000000000000000000000146100a6577fd2b576ec000000000000000000000000000000000000000000000000000000005f5260045ffd5b6100ae61016b565b005b5f806001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416368280378136915af43d5f803e156100f3573d5ff35b3d5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761014a57604052565b6100f7565b67ffffffffffffffff811161014a57601f01601f191660200190565b366004116101f35760403660031901126101f3576004356001600160a01b0381168091036101f3576024359067ffffffffffffffff82116101f357366023830112156101f3578160040135906101c86101c38361014f565b610124565b9180835236602482860101116101f3576020815f9260246101f1970183870137840101526101f7565b565b5f80fd5b90813b156102d9576001600160a01b038216807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28051156102a8576102a59161030e565b50565b5050346102b157565b7fb398979f000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b03827f4c9c8ce3000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b5f8061034093602081519101845af43d15610343573d916103316101c38461014f565b9283523d5f602085013e610347565b90565b6060915b90610384575080511561035c57805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b815115806103ca575b610395575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b1561038d56fea26469706673582212205fb1ef45360fa87114903ac7ff35f8b50aae4101722212022b0f178738a978ad64736f6c634300081c003360803460b857601f6104d038819003918201601f19168301916001600160401b0383118484101760bc5780849260209460405283398101031260b857516001600160a01b0381169081900360b857801560a5575f80546001600160a01b031981168317825560405192916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36103ff90816100d18239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f5f3560e01c8063715018a6146102e05780638da5cb5b146102bb5780639623609d14610168578063ad3cb1cc146101035763f2fde38b14610051575f80fd5b34610100576020366003190112610100576004356001600160a01b0381168091036100fe5761007e61038a565b80156100d2576001600160a01b0382548273ffffffffffffffffffffffffffffffffffffffff198216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6024827f1e4fbdf700000000000000000000000000000000000000000000000000000000815280600452fd5b505b80fd5b503461010057806003193601126101005750610164604051610126604082610344565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190610366565b0390f35b50606036600319011261028a576004356001600160a01b03811680910361028a576024356001600160a01b03811680910361028a5760443567ffffffffffffffff811161028a573660238201121561028a57806004013567ffffffffffffffff811161028e57604051916101e6601f8301601f191660200184610344565b818352366024838301011161028a57815f92602460209301838601378301015261020e61038a565b823b1561028a5761025d925f926040518095819482937f4f1ef2860000000000000000000000000000000000000000000000000000000084526004840152604060248401526044830190610366565b039134905af1801561027f57610271575080f35b61027d91505f90610344565b005b6040513d5f823e3d90fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b3461028a575f36600319011261028a5760206001600160a01b035f5416604051908152f35b3461028a575f36600319011261028a576102f861038a565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b90601f8019910116810190811067ffffffffffffffff82111761028e57604052565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6001600160a01b035f5416330361039d57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea264697066735822122087ed775a4d6d3ac2f30f3ac551807433be2f1f5c398ad2935bfd3a3586ec9ec464736f6c634300081c0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c1000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000d69ab273785a2d65719f13eeeea2b46c3e814988000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c10000000000000000000000000183e61bde23a80f4d1e003653288d4b4551681ed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","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":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x674852aac3603a4cf861623e8c004794a411a98e19182ca1bd822d3de96b298e"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3Proxy#ICreateX.deployCreate3","hash":"0x674852aac3603a4cf861623e8c004794a411a98e19182ca1bd822d3de96b298e","networkInteractionId":1,"receipt":{"blockHash":"0x7e0c66da324129dce07bfedaa601bad80b4523ef064eb4d04546133536e247dd","blockNumber":46339733,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":88,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000e8be012232c6ff963e7eeeac0716c074c8122c1b","0x027aee58e7818dd334685b55f13dfd8874e10430371d406992104f00b291c27e"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":89,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x0000000000000000000000008f84ca9801533cae282f95924fadb88a3689a34d"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":90,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c10"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x","logIndex":91,"topics":["0xacfbb618325d1abc35c2404086871d507dcae4af0a50a143962f8606f16dde10","0x000000000000000000000000183e61bde23a80f4d1e003653288d4b4551681ed"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":92,"topics":["0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"]},{"address":"0xfF7723F03958b0E457B132657849b62811D53AE3","data":"0x","logIndex":93,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c10"]},{"address":"0x8be430d29a2c5692f9345a28506b849C6a99eDaA","data":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff7723f03958b0e457b132657849b62811d53ae3","logIndex":94,"topics":["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":95,"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":"0x674852aac3603a4cf861623e8c004794a411a98e19182ca1bd822d3de96b298e","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","0x60a034607757601f6106e838819003918201601f19168301916001600160401b03831184841017607b57808492602094604052833981010312607757516001600160a01b038116810360775760015f556080526040516106589081610090823960805181818160840152818161025a01526103020152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146103e8575080634ae000411461027e578063ab221a761461023b5763beabacc814610048575f80fd5b3461023757606036600319011261023757610061610486565b602435906001600160a01b03821680920361023757604435906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361020f576001600160a01b03906100bb61052b565b169073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82036101435780471061012d575f80808084875af16100ef610562565b9015610128575060207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee915b604051908152a360015f55005b6105eb565b4763cf47918160e01b5f5260045260245260445ffd5b60205f604051828101907fa9059cbb0000000000000000000000000000000000000000000000000000000082528660248201528460448201526044815261018b60648261049c565b519082865af115610204575f513d6101fb5750813b155b6101cf5760207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee9161011b565b507f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b600114156101a2565b6040513d5f823e3d90fd5b7f7fd7572d000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f80fd5b34610237575f3660031901126102375760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461023757606036600319011261023757610297610486565b6024359067ffffffffffffffff821161023757366023830112156102375781600401356102c3816104eb565b906102d1604051928361049c565b8082526020820193366024838301011161023757815f92602460209301873783010152604435926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361020f5761033061052b565b8347106103d15761039c826103b26001600160a01b036103875f807f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e976103cd9b9951908a8c5af1610380610562565b9089610591565b96604051948594606086526060860190610507565b9660208501528387036040850152169486610507565b0390a260015f55604051918291602083526020830190610507565b0390f35b834763cf47918160e01b5f5260045260245260445ffd5b3461023757602036600319011261023757600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361023757817ff44bac89000000000000000000000000000000000000000000000000000000006020931490811561045c575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610455565b600435906001600160a01b038216820361023757565b90601f8019910116810190811067ffffffffffffffff8211176104be57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116104be57601f01601f191660200190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60025f541461053a5760025f55565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b3d1561058c573d90610573826104eb565b91610581604051938461049c565b82523d5f602084013e565b606090565b9061059c57506105eb565b815115806105e2575b6105ad575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156105a5565b8051156105fa57805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212205d08139b46ebd4a7481627e6a878eacbfdd39c4d20ccdfc34a2f8584abc02a6464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"],"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":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000043026040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000070860a034607757601f6106e838819003918201601f19168301916001600160401b03831184841017607b57808492602094604052833981010312607757516001600160a01b038116810360775760015f556080526040516106589081610090823960805181818160840152818161025a01526103020152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146103e8575080634ae000411461027e578063ab221a761461023b5763beabacc814610048575f80fd5b3461023757606036600319011261023757610061610486565b602435906001600160a01b03821680920361023757604435906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361020f576001600160a01b03906100bb61052b565b169073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82036101435780471061012d575f80808084875af16100ef610562565b9015610128575060207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee915b604051908152a360015f55005b6105eb565b4763cf47918160e01b5f5260045260245260445ffd5b60205f604051828101907fa9059cbb0000000000000000000000000000000000000000000000000000000082528660248201528460448201526044815261018b60648261049c565b519082865af115610204575f513d6101fb5750813b155b6101cf5760207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee9161011b565b507f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b600114156101a2565b6040513d5f823e3d90fd5b7f7fd7572d000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f80fd5b34610237575f3660031901126102375760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461023757606036600319011261023757610297610486565b6024359067ffffffffffffffff821161023757366023830112156102375781600401356102c3816104eb565b906102d1604051928361049c565b8082526020820193366024838301011161023757815f92602460209301873783010152604435926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361020f5761033061052b565b8347106103d15761039c826103b26001600160a01b036103875f807f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e976103cd9b9951908a8c5af1610380610562565b9089610591565b96604051948594606086526060860190610507565b9660208501528387036040850152169486610507565b0390a260015f55604051918291602083526020830190610507565b0390f35b834763cf47918160e01b5f5260045260245260445ffd5b3461023757602036600319011261023757600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361023757817ff44bac89000000000000000000000000000000000000000000000000000000006020931490811561045c575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610455565b600435906001600160a01b038216820361023757565b90601f8019910116810190811067ffffffffffffffff8211176104be57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116104be57601f01601f191660200190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60025f541461053a5760025f55565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b3d1561058c573d90610573826104eb565b91610581604051938461049c565b82523d5f602084013e565b606090565b9061059c57506105eb565b815115806105e2575b6105ad575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156105a5565b8051156105fa57805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212205d08139b46ebd4a7481627e6a878eacbfdd39c4d20ccdfc34a2f8584abc02a6464736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa000000000000000000000000000000000000000000000000","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":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xab4b3da55a594b811db18fba6c06bfec27512954fbb85aa16ee07c42337025a8"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccount7702#ICreateX.deployCreate3","hash":"0xab4b3da55a594b811db18fba6c06bfec27512954fbb85aa16ee07c42337025a8","networkInteractionId":1,"receipt":{"blockHash":"0x70d8e998fd61ec61c4cd20144ad5b17d423857e20cd7b5c781c028a1016e7792","blockNumber":46339745,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":377,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000b800ea953426e361efda80da69765895ab3b04da","0x4d548e60a06ca5826dcab93682802743ae2369c7da6162da7a3f4201826a6d33"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":378,"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":"0xab4b3da55a594b811db18fba6c06bfec27512954fbb85aa16ee07c42337025a8","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"}
+{"artifactId":"Create3SmartAccountContractPublic#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3SmartAccountContractPublic#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000008042601","0x60803461012257601f610d0238819003918201601f19168301916001600160401b03831184841017610126578084926040948552833981010312610122576100468161013a565b906001600160a01b039061005c9060200161013a565b1690811561010f575f80546001600160a01b031981168417825560405193916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556001600160a01b0316801561010057600380546001600160a01b031916821790557f91b7b87cc50ee71ce8dc7cdc2c2d6434b8525023c067481a16db26fa5b5be9ac5f80a2610bb3908161014f8239f35b6321cb06d160e21b5f5260045ffd5b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101225756fe608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c90816301ffc9a7146107e85750806307f19eba1461074b5780631626ba7e146106895780634ae000411461055c578063715018a6146104f85780638da5cb5b146104d3578063ab221a76146104ad578063beabacc8146102bd578063dc1424881461018b578063dddf6ff91461014e5763f2fde38b146100a1575f61000f565b3461014a57602036600319011261014a576001600160a01b036100c2610886565b6100ca610989565b16801561011e576001600160a01b035f548273ffffffffffffffffffffffffffffffffffffffff198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5f80fd5b3461014a57602036600319011261014a576001600160a01b0361016f610886565b165f526002602052602060ff60405f2054166040519015158152f35b3461014a57604036600319011261014a5760043567ffffffffffffffff811161014a573660238201121561014a57806004013590602460206101cc84610971565b6101d9604051918261089c565b848152019260051b8201019036821161014a57602401915b81831061029d5760243567ffffffffffffffff811161014a573660238201121561014a578060040135906024602061022884610971565b610235604051918261089c565b848152019260051b8201019036821161014a57602401915b8183106102845761025c610989565b7fe8d3a4a7000000000000000000000000000000000000000000000000000000005f5260045ffd5b8235801515810361014a5781526020928301920161024d565b82356001600160a01b038116810361014a578152602092830192016101f1565b3461014a57606036600319011261014a576102d6610886565b602435906001600160a01b03821680920361014a57604435906001600160a01b035f541633148015610499575b1561046d576001600160a01b0390610319610a84565b169073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82036103a15780471061038b575f80808084875af161034d610abd565b9015610386575060207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee915b604051908152a360018055005b610b46565b4763cf47918160e01b5f5260045260245260445ffd5b60205f604051828101907fa9059cbb000000000000000000000000000000000000000000000000000000008252866024820152846044820152604481526103e960648261089c565b519082865af115610462575f513d6104595750813b155b61042d5760207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee91610379565b507f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60011415610400565b6040513d5f823e3d90fd5b7f2f55c6f5000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b506001600160a01b03600354163314610303565b3461014a575f36600319011261014a5760206001600160a01b0360035416604051908152f35b3461014a575f36600319011261014a5760206001600160a01b035f5416604051908152f35b3461014a575f36600319011261014a57610510610989565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461014a57606036600319011261014a57610575610886565b60243567ffffffffffffffff811161014a57610595903690600401610907565b90604435916001600160a01b035f541633148015610675575b1561046d576105bb610a84565b82471061065e57917f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e6106298461063f6001600160a01b036106145f8061065a9a51602087018a8c5af161060d610abd565b9089610aec565b9660405194859460608652606086019061094d565b966020850152838703604085015216948661094d565b0390a26001805560405191829160208352602083019061094d565b0390f35b824763cf47918160e01b5f5260045260245260445ffd5b506001600160a01b036003541633146105ae565b3461014a57604036600319011261014a5760243567ffffffffffffffff811161014a576106cd6106c56001600160a01b03923690600401610907565b6004356109c8565b505016156107235760207f1626ba7e000000000000000000000000000000000000000000000000000000005b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b60207fffffffff000000000000000000000000000000000000000000000000000000006106f9565b3461014a57602036600319011261014a576001600160a01b0361076c610886565b610774610989565b1680156107c0578073ffffffffffffffffffffffffffffffffffffffff1960035416176003557f91b7b87cc50ee71ce8dc7cdc2c2d6434b8525023c067481a16db26fa5b5be9ac5f80a2005b7f872c1b44000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461014a57602036600319011261014a57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361014a57817ff44bac89000000000000000000000000000000000000000000000000000000006020931490811561085c575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610855565b600435906001600160a01b038216820361014a57565b90601f8019910116810190811067ffffffffffffffff8211176108be57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116108be57601f01601f191660200190565b81601f8201121561014a5780359061091e826108eb565b9261092c604051948561089c565b8284526020838301011161014a57815f926020809301838601378301015290565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b67ffffffffffffffff81116108be5760051b60200190565b6001600160a01b035f5416330361099c57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b81519190604183036109f8576109f19250602082015190606060408401519301515f1a90610a02565b9192909190565b50505f9160029190565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411610a79579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610462575f516001600160a01b03811615610a6f57905f905f90565b505f906001905f90565b5050505f9160039190565b600260015414610a95576002600155565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b3d15610ae7573d90610ace826108eb565b91610adc604051938461089c565b82523d5f602084013e565b606090565b90610af75750610b46565b81511580610b3d575b610b08575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15610b00565b805115610b5557805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212208ee6318fe9c4c3bbaf0821a1d3e5ae7a52963dec77a5011895cac1fc1e65048264736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c10"],"artifactId":"Create3SmartAccountContractPublic#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3SmartAccountContractPublic#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3SmartAccountContractPublic#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3SmartAccountContractPublic#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b00000000000000000804260100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000d4260803461012257601f610d0238819003918201601f19168301916001600160401b03831184841017610126578084926040948552833981010312610122576100468161013a565b906001600160a01b039061005c9060200161013a565b1690811561010f575f80546001600160a01b031981168417825560405193916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556001600160a01b0316801561010057600380546001600160a01b031916821790557f91b7b87cc50ee71ce8dc7cdc2c2d6434b8525023c067481a16db26fa5b5be9ac5f80a2610bb3908161014f8239f35b6321cb06d160e21b5f5260045ffd5b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101225756fe608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c90816301ffc9a7146107e85750806307f19eba1461074b5780631626ba7e146106895780634ae000411461055c578063715018a6146104f85780638da5cb5b146104d3578063ab221a76146104ad578063beabacc8146102bd578063dc1424881461018b578063dddf6ff91461014e5763f2fde38b146100a1575f61000f565b3461014a57602036600319011261014a576001600160a01b036100c2610886565b6100ca610989565b16801561011e576001600160a01b035f548273ffffffffffffffffffffffffffffffffffffffff198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5f80fd5b3461014a57602036600319011261014a576001600160a01b0361016f610886565b165f526002602052602060ff60405f2054166040519015158152f35b3461014a57604036600319011261014a5760043567ffffffffffffffff811161014a573660238201121561014a57806004013590602460206101cc84610971565b6101d9604051918261089c565b848152019260051b8201019036821161014a57602401915b81831061029d5760243567ffffffffffffffff811161014a573660238201121561014a578060040135906024602061022884610971565b610235604051918261089c565b848152019260051b8201019036821161014a57602401915b8183106102845761025c610989565b7fe8d3a4a7000000000000000000000000000000000000000000000000000000005f5260045ffd5b8235801515810361014a5781526020928301920161024d565b82356001600160a01b038116810361014a578152602092830192016101f1565b3461014a57606036600319011261014a576102d6610886565b602435906001600160a01b03821680920361014a57604435906001600160a01b035f541633148015610499575b1561046d576001600160a01b0390610319610a84565b169073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82036103a15780471061038b575f80808084875af161034d610abd565b9015610386575060207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee915b604051908152a360018055005b610b46565b4763cf47918160e01b5f5260045260245260445ffd5b60205f604051828101907fa9059cbb000000000000000000000000000000000000000000000000000000008252866024820152846044820152604481526103e960648261089c565b519082865af115610462575f513d6104595750813b155b61042d5760207fd1ba4ac2e2a11b5101f6cb4d978f514a155b421e8ec396d2d9abaf0bb02917ee91610379565b507f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60011415610400565b6040513d5f823e3d90fd5b7f2f55c6f5000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b506001600160a01b03600354163314610303565b3461014a575f36600319011261014a5760206001600160a01b0360035416604051908152f35b3461014a575f36600319011261014a5760206001600160a01b035f5416604051908152f35b3461014a575f36600319011261014a57610510610989565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461014a57606036600319011261014a57610575610886565b60243567ffffffffffffffff811161014a57610595903690600401610907565b90604435916001600160a01b035f541633148015610675575b1561046d576105bb610a84565b82471061065e57917f8e5d52c2fd20a8ca33fcfe8232fb93b5c1b40ac5c050512ac0ba6033dfb02d4e6106298461063f6001600160a01b036106145f8061065a9a51602087018a8c5af161060d610abd565b9089610aec565b9660405194859460608652606086019061094d565b966020850152838703604085015216948661094d565b0390a26001805560405191829160208352602083019061094d565b0390f35b824763cf47918160e01b5f5260045260245260445ffd5b506001600160a01b036003541633146105ae565b3461014a57604036600319011261014a5760243567ffffffffffffffff811161014a576106cd6106c56001600160a01b03923690600401610907565b6004356109c8565b505016156107235760207f1626ba7e000000000000000000000000000000000000000000000000000000005b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b60207fffffffff000000000000000000000000000000000000000000000000000000006106f9565b3461014a57602036600319011261014a576001600160a01b0361076c610886565b610774610989565b1680156107c0578073ffffffffffffffffffffffffffffffffffffffff1960035416176003557f91b7b87cc50ee71ce8dc7cdc2c2d6434b8525023c067481a16db26fa5b5be9ac5f80a2005b7f872c1b44000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461014a57602036600319011261014a57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361014a57817ff44bac89000000000000000000000000000000000000000000000000000000006020931490811561085c575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610855565b600435906001600160a01b038216820361014a57565b90601f8019910116810190811067ffffffffffffffff8211176108be57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff81116108be57601f01601f191660200190565b81601f8201121561014a5780359061091e826108eb565b9261092c604051948561089c565b8284526020838301011161014a57815f926020809301838601378301015290565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b67ffffffffffffffff81116108be5760051b60200190565b6001600160a01b035f5416330361099c57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b81519190604183036109f8576109f19250602082015190606060408401519301515f1a90610a02565b9192909190565b50505f9160029190565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411610a79579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610462575f516001600160a01b03811615610a6f57905f905f90565b505f906001905f90565b5050505f9160039190565b600260015414610a95576002600155565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b3d15610ae7573d90610ace826108eb565b91610adc604051938461089c565b82523d5f602084013e565b606090565b90610af75750610b46565b81511580610b3d575b610b08575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15610b00565b805115610b5557805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212208ee6318fe9c4c3bbaf0821a1d3e5ae7a52963dec77a5011895cac1fc1e65048264736f6c634300081c00330000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c10000000000000000000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3SmartAccountContractPublic#ICreateX.deployCreate3","networkInteractionId":1,"nonce":11,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3SmartAccountContractPublic#ICreateX.deployCreate3","networkInteractionId":1,"nonce":11,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x9165992d5735d1e48d18c73e69d979981b3c988d442c7e3e2dfb85147f7523f3"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3SmartAccountContractPublic#ICreateX.deployCreate3","hash":"0x9165992d5735d1e48d18c73e69d979981b3c988d442c7e3e2dfb85147f7523f3","networkInteractionId":1,"receipt":{"blockHash":"0xf98acb3cc48b11fc87a3fb10fc8586f8d12246c9376ee9c4909894e8ead32b61","blockNumber":46339760,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":88,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x000000000000000000000000450ad621e97bfd43e60b3645c8acb804ed1929fe","0x557ddeef6d0f98f2e95bcc4f4b3a0869a915aeb172d29186fc969859e233eec0"]},{"address":"0x2518928fDf52319CC5A9a797354cf159cD2221bB","data":"0x","logIndex":89,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000e96bf5df2fe7034b16c1fd4e19a8d44edd1c1c10"]},{"address":"0x2518928fDf52319CC5A9a797354cf159cD2221bB","data":"0x","logIndex":90,"topics":["0x91b7b87cc50ee71ce8dc7cdc2c2d6434b8525023c067481a16db26fa5b5be9ac","0x0000000000000000000000008be430d29a2c5692f9345a28506b849c6a99edaa"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":91,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000002518928fdf52319cc5a9a797354cf159cd2221bb"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"futureId":"Create3SmartAccountContractPublic#ICreateX.deployCreate3","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"}
+{"artifactId":"Create3SmartAccountContractPublic#ICreateX","dependencies":["Create3SmartAccountContractPublic#ICreateX.deployCreate3","Create3SmartAccountContractPublic#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3SmartAccountContractPublic#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x2518928fDf52319CC5A9a797354cf159cD2221bB","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x9165992d5735d1e48d18c73e69d979981b3c988d442c7e3e2dfb85147f7523f3","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3SmartAccountContractPublic#SmartAccountContractPublic","contractAddress":"0x2518928fDf52319CC5A9a797354cf159cD2221bB","contractName":"SmartAccountContractPublic","dependencies":["Create3SmartAccountContractPublic#ICreateX.ContractCreation.newContract.0"],"futureId":"Create3SmartAccountContractPublic#SmartAccountContractPublic","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
{"artifactId":"Create3MimicHelper#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","contractName":"ICreateX","dependencies":[],"futureId":"Create3MimicHelper#ICreateX","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"}
-{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000040","0x6080604052348015600e575f5ffd5b5060cf80601a5f395ff3fe6080604052348015600e575f5ffd5b50600436106026575f3560e01c8063effd663c14602a575b5f5ffd5b604f60353660046061565b73ffffffffffffffffffffffffffffffffffffffff163190565b60405190815260200160405180910390f35b5f602082840312156070575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff811681146092575f5ffd5b939250505056fea2646970667358221220bb1ce2cd0b8d26244d77e180ab4e56bb52690949ec0a30d5c25e3ac02f58774664736f6c634300081c0033"],"artifactId":"Create3MimicHelper#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3MimicHelper#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3MimicHelper#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e96080604052348015600e575f5ffd5b5060cf80601a5f395ff3fe6080604052348015600e575f5ffd5b50600436106026575f3560e01c8063effd663c14602a575b5f5ffd5b604f60353660046061565b73ffffffffffffffffffffffffffffffffffffffff163190565b60405190815260200160405180910390f35b5f602082840312156070575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff811681146092575f5ffd5b939250505056fea2646970667358221220bb1ce2cd0b8d26244d77e180ab4e56bb52690949ec0a30d5c25e3ac02f58774664736f6c634300081c00330000000000000000000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteractionId":1,"nonce":3,"type":"TRANSACTION_PREPARE_SEND"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteractionId":1,"nonce":3,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1400000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xcab15394a7dce4f39c8da40ff030b9033cfb57b2f2f1e84c2454b485fede401e"},"type":"TRANSACTION_SEND"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","hash":"0xcab15394a7dce4f39c8da40ff030b9033cfb57b2f2f1e84c2454b485fede401e","networkInteractionId":1,"receipt":{"blockHash":"0xccc76eaa024ca3e014ad399d94b6b1d77227ae4d7de9e503a35ea6ee14dd3fa3","blockNumber":36842644,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":7,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000009074e2fea6f668ccf7fb884fac62943acc03ea43","0x721f4d59bffa983c2a99dc5a3b93053d035180c65840e4dc318b06bb0484a80f"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":8,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000004766ef65d66e8d2d92f3089ee42e5705e8817ff0"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"}
+{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000008042602","0x60808060405234601557610604908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80631c1bbd371461024b57806353f71fd31461012e5780637e105ce2146100df578063e7032021146100785763effd663c14610050575f80fd5b3461007457602036600319011261007457602061006b6104c5565b31604051908152f35b5f80fd5b346100745760403660031901126100745760243561ffff81168091036100745761271081116100b7576100af60209160043561054a565b604051908152f35b7fdd9d6426000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100745760203660031901126100745761012a6100fb6104c5565b803b5f610107826104a9565b926101156040519485610487565b82845260208401903c604051918291826104e8565b0390f35b34610074576040366003190112610074576101476104c5565b60243567ffffffffffffffff81116100745773ffffffffffffffffffffffffffffffffffffffff9161017f6020923690600401610459565b939091165f525f825260405f20836040519485938437820190815203019020604051905f908054906101b082610512565b808552916001811690811561022457506001146101e4575b61012a846101d881860382610487565b604051918291826104e8565b5f90815260208120939250905b80821061020a575090915081016020016101d8826101c8565b9192600181602092548385880101520191019092916101f1565b60ff191660208087019190915292151560051b850190920192506101d891508390506101c8565b346100745760403660031901126100745760043567ffffffffffffffff81116100745761027c903690600401610459565b6024359067ffffffffffffffff82116100745736602383011215610074578160040135926102a9846104a9565b936102b76040519586610487565b8085526020850193366024838301011161007457815f92602460209301873786010152335f525f60205260405f20602060405180928585833785820190815203019020845167ffffffffffffffff8111610445576103158254610512565b601f8111610400575b50806020601f821160011461039f575f91610394575b508160011b915f199060031b1c19161790555b81604051928392833781015f815203902091604051918291518091835e81015f815203902090337f56ab5c6148f0ccf4e18c36573ddf31db2c597b58811188358cc6935661a388365f80a4005b905086015187610334565b5f8481528181209250601f198416905b8181106103e8575090836001949392106103d0575b5050811b019055610347565b8801515f1960f88460031b161c1916905587806103c4565b9192602060018192868d0151815501940192016103af565b825f5260205f20601f830160051c8101916020841061043b575b601f0160051c01905b818110610430575061031e565b5f8155600101610423565b909150819061041a565b634e487b7160e01b5f52604160045260245ffd5b9181601f840112156100745782359167ffffffffffffffff8311610074576020838186019501011161007457565b90601f8019910116810190811067ffffffffffffffff82111761044557604052565b67ffffffffffffffff811161044557601f01601f191660200190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361007457565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b90600182811c92168015610540575b602083101461052c57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610521565b9091905f905f1984820990848102928380841093039280840393146105c1578261271011156105af57507fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e919394612710910990828211900360fc1b910360041c170290565b634e487b71905260116020526024601cfd5b505050612710919250049056fea26469706673582212207102bef7cae26c021466dcd8e471e5727409d7eb7c52d658932ae94dca17d5d664736f6c634300081c0033"],"artifactId":"Create3MimicHelper#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3MimicHelper#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3MimicHelper#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
+{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b0000000000000000080426020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000061e60808060405234601557610604908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80631c1bbd371461024b57806353f71fd31461012e5780637e105ce2146100df578063e7032021146100785763effd663c14610050575f80fd5b3461007457602036600319011261007457602061006b6104c5565b31604051908152f35b5f80fd5b346100745760403660031901126100745760243561ffff81168091036100745761271081116100b7576100af60209160043561054a565b604051908152f35b7fdd9d6426000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100745760203660031901126100745761012a6100fb6104c5565b803b5f610107826104a9565b926101156040519485610487565b82845260208401903c604051918291826104e8565b0390f35b34610074576040366003190112610074576101476104c5565b60243567ffffffffffffffff81116100745773ffffffffffffffffffffffffffffffffffffffff9161017f6020923690600401610459565b939091165f525f825260405f20836040519485938437820190815203019020604051905f908054906101b082610512565b808552916001811690811561022457506001146101e4575b61012a846101d881860382610487565b604051918291826104e8565b5f90815260208120939250905b80821061020a575090915081016020016101d8826101c8565b9192600181602092548385880101520191019092916101f1565b60ff191660208087019190915292151560051b850190920192506101d891508390506101c8565b346100745760403660031901126100745760043567ffffffffffffffff81116100745761027c903690600401610459565b6024359067ffffffffffffffff82116100745736602383011215610074578160040135926102a9846104a9565b936102b76040519586610487565b8085526020850193366024838301011161007457815f92602460209301873786010152335f525f60205260405f20602060405180928585833785820190815203019020845167ffffffffffffffff8111610445576103158254610512565b601f8111610400575b50806020601f821160011461039f575f91610394575b508160011b915f199060031b1c19161790555b81604051928392833781015f815203902091604051918291518091835e81015f815203902090337f56ab5c6148f0ccf4e18c36573ddf31db2c597b58811188358cc6935661a388365f80a4005b905086015187610334565b5f8481528181209250601f198416905b8181106103e8575090836001949392106103d0575b5050811b019055610347565b8801515f1960f88460031b161c1916905587806103c4565b9192602060018192868d0151815501940192016103af565b825f5260205f20601f830160051c8101916020841061043b575b601f0160051c01905b818110610430575061031e565b5f8155600101610423565b909150819061041a565b634e487b7160e01b5f52604160045260245ffd5b9181601f840112156100745782359167ffffffffffffffff8311610074576020838186019501011161007457565b90601f8019910116810190811067ffffffffffffffff82111761044557604052565b67ffffffffffffffff811161044557601f01601f191660200190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361007457565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b90600182811c92168015610540575b602083101461052c57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610521565b9091905f905f1984820990848102928380841093039280840393146105c1578261271011156105af57507fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e919394612710910990828211900360fc1b910360041c170290565b634e487b71905260116020526024601cfd5b505050612710919250049056fea26469706673582212207102bef7cae26c021466dcd8e471e5727409d7eb7c52d658932ae94dca17d5d664736f6c634300081c00330000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
+{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteractionId":1,"nonce":12,"type":"TRANSACTION_PREPARE_SEND"}
+{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteractionId":1,"nonce":12,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"11000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x2488ef9e073cab554e4425ca5689d2c469189e40771822922c9ab73a8c68eecb"},"type":"TRANSACTION_SEND"}
+{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","hash":"0x2488ef9e073cab554e4425ca5689d2c469189e40771822922c9ab73a8c68eecb","networkInteractionId":1,"receipt":{"blockHash":"0x59eee2d927dd988156d045313c6628117e0c91b348149061ef6cc27fa482cebf","blockNumber":46339772,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":148,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000005155ef81a0003c831f644a152f2e6f73cf46826d","0x4b40d3d50f1ed1ca1a595da87762ed3adb8c7d07a22013a0c35cc2b1c5a98af2"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":149,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x0000000000000000000000002ef71e27560874b932ef1cf9e95d340595a92f44"]}],"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":"0x4766EF65d66E8D2d92F3089Ee42e5705e8817FF0","strategy":"basic","strategyConfig":{},"txToReadFrom":"0xcab15394a7dce4f39c8da40ff030b9033cfb57b2f2f1e84c2454b485fede401e","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x4766EF65d66E8D2d92F3089Ee42e5705e8817FF0","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":"Create3MimicHelper#MimicHelper","type":"WIPE_APPLY"}
-{"futureId":"Create3MimicHelper#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","type":"WIPE_APPLY"}
-{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000041","0x6080604052348015600e575f5ffd5b506105dd8061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80631c1bbd371461004357806353f71fd314610058578063effd663c14610081575b5f5ffd5b610056610051366004610295565b6100b7565b005b61006b61006636600461039f565b610150565b60405161007891906103ee565b60405180910390f35b6100a961008f366004610423565b73ffffffffffffffffffffffffffffffffffffffff163190565b604051908152602001610078565b335f908152602081905260409081902090518291906100d99086908690610443565b908152602001604051809103902090816100f391906104d6565b50806040516101029190610591565b6040518091039020838360405161011a929190610443565b6040519081900381209033907f56ab5c6148f0ccf4e18c36573ddf31db2c597b58811188358cc6935661a38836905f90a4505050565b60605f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20838360405161019e929190610443565b908152602001604051809103902080546101b790610452565b80601f01602080910402602001604051908101604052809291908181526020018280546101e390610452565b801561022e5780601f106102055761010080835404028352916020019161022e565b820191905f5260205f20905b81548152906001019060200180831161021157829003601f168201915b505050505090509392505050565b5f5f83601f84011261024c575f5ffd5b50813567ffffffffffffffff811115610263575f5ffd5b60208301915083602082850101111561027a575f5ffd5b9250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f604084860312156102a7575f5ffd5b833567ffffffffffffffff8111156102bd575f5ffd5b6102c98682870161023c565b909450925050602084013567ffffffffffffffff8111156102e8575f5ffd5b8401601f810186136102f8575f5ffd5b803567ffffffffffffffff81111561031257610312610281565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561034157610341610281565b604052818152828201602001881015610358575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b803573ffffffffffffffffffffffffffffffffffffffff8116811461039a575f5ffd5b919050565b5f5f5f604084860312156103b1575f5ffd5b6103ba84610377565b9250602084013567ffffffffffffffff8111156103d5575f5ffd5b6103e18682870161023c565b9497909650939450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215610433575f5ffd5b61043c82610377565b9392505050565b818382375f9101908152919050565b600181811c9082168061046657607f821691505b60208210810361048457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156104d157805f5260205f20601f840160051c810160208510156104af5750805b601f840160051c820191505b818110156104ce575f81556001016104bb565b50505b505050565b815167ffffffffffffffff8111156104f0576104f0610281565b610504816104fe8454610452565b8461048a565b6020601f821160018114610536575f831561051f5750848201515b5f19600385901b1c1916600184901b1784556104ce565b5f84815260208120601f198516915b828110156105655787850151825560209485019460019092019101610545565b508482101561058257868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f92019182525091905056fea2646970667358221220c539e81f90b7e5554ba1dcf1c0cdd13d960f41ee3dbf256624cd7edd11bbbafa64736f6c634300081c0033"],"artifactId":"Create3MimicHelper#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3MimicHelper#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3MimicHelper#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000041000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005f96080604052348015600e575f5ffd5b506105dd8061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80631c1bbd371461004357806353f71fd314610058578063effd663c14610081575b5f5ffd5b610056610051366004610295565b6100b7565b005b61006b61006636600461039f565b610150565b60405161007891906103ee565b60405180910390f35b6100a961008f366004610423565b73ffffffffffffffffffffffffffffffffffffffff163190565b604051908152602001610078565b335f908152602081905260409081902090518291906100d99086908690610443565b908152602001604051809103902090816100f391906104d6565b50806040516101029190610591565b6040518091039020838360405161011a929190610443565b6040519081900381209033907f56ab5c6148f0ccf4e18c36573ddf31db2c597b58811188358cc6935661a38836905f90a4505050565b60605f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20838360405161019e929190610443565b908152602001604051809103902080546101b790610452565b80601f01602080910402602001604051908101604052809291908181526020018280546101e390610452565b801561022e5780601f106102055761010080835404028352916020019161022e565b820191905f5260205f20905b81548152906001019060200180831161021157829003601f168201915b505050505090509392505050565b5f5f83601f84011261024c575f5ffd5b50813567ffffffffffffffff811115610263575f5ffd5b60208301915083602082850101111561027a575f5ffd5b9250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f604084860312156102a7575f5ffd5b833567ffffffffffffffff8111156102bd575f5ffd5b6102c98682870161023c565b909450925050602084013567ffffffffffffffff8111156102e8575f5ffd5b8401601f810186136102f8575f5ffd5b803567ffffffffffffffff81111561031257610312610281565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561034157610341610281565b604052818152828201602001881015610358575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b803573ffffffffffffffffffffffffffffffffffffffff8116811461039a575f5ffd5b919050565b5f5f5f604084860312156103b1575f5ffd5b6103ba84610377565b9250602084013567ffffffffffffffff8111156103d5575f5ffd5b6103e18682870161023c565b9497909650939450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215610433575f5ffd5b61043c82610377565b9392505050565b818382375f9101908152919050565b600181811c9082168061046657607f821691505b60208210810361048457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156104d157805f5260205f20601f840160051c810160208510156104af5750805b601f840160051c820191505b818110156104ce575f81556001016104bb565b50505b505050565b815167ffffffffffffffff8111156104f0576104f0610281565b610504816104fe8454610452565b8461048a565b6020601f821160018114610536575f831561051f5750848201515b5f19600385901b1c1916600184901b1784556104ce565b5f84815260208120601f198516915b828110156105655787850151825560209485019460019092019101610545565b508482101561058257868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f92019182525091905056fea2646970667358221220c539e81f90b7e5554ba1dcf1c0cdd13d960f41ee3dbf256624cd7edd11bbbafa64736f6c634300081c003300000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteractionId":1,"nonce":4,"type":"TRANSACTION_PREPARE_SEND"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteractionId":1,"nonce":4,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1400000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x98e6de7fd380ca593fa61e6ecf371c7ec7bc1863ad026f43c3129ac22650bc9f"},"type":"TRANSACTION_SEND"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","hash":"0x98e6de7fd380ca593fa61e6ecf371c7ec7bc1863ad026f43c3129ac22650bc9f","networkInteractionId":1,"receipt":{"blockHash":"0x813bc048a1c2aeff0ec3378a9cdf79478d72b2235aa0a851a33246d3645bc3e3","blockNumber":37190091,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":32,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x00000000000000000000000080805abfb75ce895ce5789591599f400586fc42f","0x3cd464f57929c290712b10bd3b9d79f6bd9ffd432026f0117b507abb10c4c8aa"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":33,"topics":["0x4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b511","0x000000000000000000000000b5dfcabaef8fa7b0c73e2bff01c6014a1f04025a"]}],"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":"0xb5DfCaBAef8fa7B0c73e2bFF01c6014a1f04025a","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x98e6de7fd380ca593fa61e6ecf371c7ec7bc1863ad026f43c3129ac22650bc9f","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
-{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0xb5DfCaBAef8fa7B0c73e2bFF01c6014a1f04025a","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":"Create3MimicHelper#MimicHelper","type":"WIPE_APPLY"}
-{"futureId":"Create3MimicHelper#ICreateX.ContractCreation.newContract.0","type":"WIPE_APPLY"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","type":"WIPE_APPLY"}
-{"args":["0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000042","0x6080604052348015600e575f5ffd5b506105f48061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80631c1bbd371461004e57806353f71fd3146100635780637e105ce21461008c578063effd663c1461009f575b5f5ffd5b61006161005c3660046102b9565b6100c8565b005b6100766100713660046103b6565b610161565b6040516100839190610405565b60405180910390f35b61007661009a36600461043a565b610233565b6100ba6100ad36600461043a565b6001600160a01b03163190565b604051908152602001610083565b335f908152602081905260409081902090518291906100ea908690869061045a565b9081526020016040518091039020908161010491906104ed565b508060405161011391906105a8565b6040518091039020838360405161012b92919061045a565b6040519081900381209033907f56ab5c6148f0ccf4e18c36573ddf31db2c597b58811188358cc6935661a38836905f90a4505050565b60605f5f856001600160a01b03166001600160a01b031681526020019081526020015f20838360405161019592919061045a565b908152602001604051809103902080546101ae90610469565b80601f01602080910402602001604051908101604052809291908181526020018280546101da90610469565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505090509392505050565b6060816001600160a01b0316803b806020016040519081016040528181525f908060200190933c92915050565b5f5f83601f840112610270575f5ffd5b50813567ffffffffffffffff811115610287575f5ffd5b60208301915083602082850101111561029e575f5ffd5b9250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f604084860312156102cb575f5ffd5b833567ffffffffffffffff8111156102e1575f5ffd5b6102ed86828701610260565b909450925050602084013567ffffffffffffffff81111561030c575f5ffd5b8401601f8101861361031c575f5ffd5b803567ffffffffffffffff811115610336576103366102a5565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610365576103656102a5565b60405281815282820160200188101561037c575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b80356001600160a01b03811681146103b1575f5ffd5b919050565b5f5f5f604084860312156103c8575f5ffd5b6103d18461039b565b9250602084013567ffffffffffffffff8111156103ec575f5ffd5b6103f886828701610260565b9497909650939450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561044a575f5ffd5b6104538261039b565b9392505050565b818382375f9101908152919050565b600181811c9082168061047d57607f821691505b60208210810361049b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156104e857805f5260205f20601f840160051c810160208510156104c65750805b601f840160051c820191505b818110156104e5575f81556001016104d2565b50505b505050565b815167ffffffffffffffff811115610507576105076102a5565b61051b816105158454610469565b846104a1565b6020601f82116001811461054d575f83156105365750848201515b5f19600385901b1c1916600184901b1784556104e5565b5f84815260208120601f198516915b8281101561057c578785015182556020948501946001909201910161055c565b508482101561059957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f92019182525091905056fea26469706673582212203ecf313e33ffc17bcc5dffe1fa123cd9bf2d3c584d41391a2f7f78513def6ed364736f6c634300081c0033"],"artifactId":"Create3MimicHelper#ICreateX","contractAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","dependencies":["Create3MimicHelper#ICreateX"],"from":"0x3a0ce8115b4913f42c4928d6bc3f554e9a81468b","functionName":"deployCreate3","futureId":"Create3MimicHelper#ICreateX.deployCreate3","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteraction":{"data":"0x9c36a2863a0ce8115b4913f42c4928d6bc3f554e9a81468b000000000000000000000042000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000006106080604052348015600e575f5ffd5b506105f48061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80631c1bbd371461004e57806353f71fd3146100635780637e105ce21461008c578063effd663c1461009f575b5f5ffd5b61006161005c3660046102b9565b6100c8565b005b6100766100713660046103b6565b610161565b6040516100839190610405565b60405180910390f35b61007661009a36600461043a565b610233565b6100ba6100ad36600461043a565b6001600160a01b03163190565b604051908152602001610083565b335f908152602081905260409081902090518291906100ea908690869061045a565b9081526020016040518091039020908161010491906104ed565b508060405161011391906105a8565b6040518091039020838360405161012b92919061045a565b6040519081900381209033907f56ab5c6148f0ccf4e18c36573ddf31db2c597b58811188358cc6935661a38836905f90a4505050565b60605f5f856001600160a01b03166001600160a01b031681526020019081526020015f20838360405161019592919061045a565b908152602001604051809103902080546101ae90610469565b80601f01602080910402602001604051908101604052809291908181526020018280546101da90610469565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505090509392505050565b6060816001600160a01b0316803b806020016040519081016040528181525f908060200190933c92915050565b5f5f83601f840112610270575f5ffd5b50813567ffffffffffffffff811115610287575f5ffd5b60208301915083602082850101111561029e575f5ffd5b9250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f604084860312156102cb575f5ffd5b833567ffffffffffffffff8111156102e1575f5ffd5b6102ed86828701610260565b909450925050602084013567ffffffffffffffff81111561030c575f5ffd5b8401601f8101861361031c575f5ffd5b803567ffffffffffffffff811115610336576103366102a5565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610365576103656102a5565b60405281815282820160200188101561037c575f5ffd5b816020840160208301375f602083830101528093505050509250925092565b80356001600160a01b03811681146103b1575f5ffd5b919050565b5f5f5f604084860312156103c8575f5ffd5b6103d18461039b565b9250602084013567ffffffffffffffff8111156103ec575f5ffd5b6103f886828701610260565b9497909650939450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561044a575f5ffd5b6104538261039b565b9392505050565b818382375f9101908152919050565b600181811c9082168061047d57607f821691505b60208210810361049b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156104e857805f5260205f20601f840160051c810160208510156104c65750805b601f840160051c820191505b818110156104e5575f81556001016104d2565b50505b505050565b815167ffffffffffffffff811115610507576105076102a5565b61051b816105158454610469565b846104a1565b6020601f82116001811461054d575f83156105365750848201515b5f19600385901b1c1916600184901b1784556104e5565b5f84815260208120601f198516915b8281101561057c578785015182556020948501946001909201910161055c565b508482101561059957868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f92019182525091905056fea26469706673582212203ecf313e33ffc17bcc5dffe1fa123cd9bf2d3c584d41391a2f7f78513def6ed364736f6c634300081c003300000000000000000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteractionId":1,"nonce":5,"type":"TRANSACTION_PREPARE_SEND"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","networkInteractionId":1,"nonce":5,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1400000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x486e5bf2c518f1b6bd3517c4f70dd08bb8508d5cbc42567cf12ec95928d7efcf"},"type":"TRANSACTION_SEND"}
-{"futureId":"Create3MimicHelper#ICreateX.deployCreate3","hash":"0x486e5bf2c518f1b6bd3517c4f70dd08bb8508d5cbc42567cf12ec95928d7efcf","networkInteractionId":1,"receipt":{"blockHash":"0xb6f383a7361b71d59c73561084b655ed009b31264da7ccc38e1bbb57c74baf1b","blockNumber":37490833,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":112,"topics":["0x2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c9067","0x0000000000000000000000008f3fe90801bfcfcdb72885f6cd5ce0482606d473","0x281d8de0dbcd36a6978283802f1436be670a166c2bf5e0778dacaea0a50df89b"]},{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":113,"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":"0x486e5bf2c518f1b6bd3517c4f70dd08bb8508d5cbc42567cf12ec95928d7efcf","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#ICreateX","dependencies":["Create3MimicHelper#ICreateX.deployCreate3","Create3MimicHelper#ICreateX"],"emitterAddress":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","eventIndex":0,"eventName":"ContractCreation","futureId":"Create3MimicHelper#ICreateX.ContractCreation.newContract.0","nameOrIndex":"newContract","result":"0x2Ef71E27560874B932EF1cF9E95d340595a92F44","strategy":"basic","strategyConfig":{},"txToReadFrom":"0x2488ef9e073cab554e4425ca5689d2c469189e40771822922c9ab73a8c68eecb","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"}
+{"artifactId":"Create3MimicHelper#MimicHelper","contractAddress":"0x2Ef71E27560874B932EF1cF9E95d340595a92F44","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