diff --git a/.gitignore b/.gitignore index e6ca5765..29ffffb7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,17 @@ # directories artifacts +artifacts-zk broadcast cache +cache_hardhat-zk coverage deployments +deployments-zk docs node_modules out out-optimized +typechain-types # files *.env diff --git a/.lintstagedrc.yml b/.lintstagedrc.yml index fcdbe168..6f1fe352 100644 --- a/.lintstagedrc.yml +++ b/.lintstagedrc.yml @@ -1,4 +1,4 @@ "*.{json,md,yml}": "prettier --write" "*.sol": - - "bun solhint {precompiles,script,src,tests}/**/*.sol --fix --noPrompt" + - "bun solhint {script,src,tests}/**/*.sol --fix --noPrompt" - "forge fmt" diff --git a/codecov.yml b/codecov.yml index a3324f7f..5d4ec124 100644 --- a/codecov.yml +++ b/codecov.yml @@ -5,6 +5,5 @@ coverage: status: patch: off ignore: - - "precompiles" - "script" - "tests" diff --git a/package.json b/package.json index 2486d7df..96d60758 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ }, "files": [ "artifacts", - "precompiles", "src", "tests/utils", "CHANGELOG.md", @@ -71,8 +70,8 @@ "clean": "rm -rf artifacts broadcast cache docs out out-optimized", "lint": "bun run lint:sol && bun run prettier:check", "lint:fix": "bun run lint:sol:fix && forge fmt", - "lint:sol": "forge fmt --check && bun solhint \"{precompiles,script,src,tests}/**/*.sol\"", - "lint:sol:fix": "bun solhint \"{precompiles,script,src,tests}/**/*.sol\" --fix --noPrompt", + "lint:sol": "forge fmt --check && bun solhint \"{script,src,tests}/**/*.sol\"", + "lint:sol:fix": "bun solhint \"{script,src,tests}/**/*.sol\" --fix --noPrompt", "prepack": "bun install && bash ./shell/prepare-artifacts.sh", "prepare": "husky", "prettier:check": "prettier --check \"**/*.{json,md,yml}\"", diff --git a/precompiles/Precompiles.sol b/precompiles/Precompiles.sol deleted file mode 100644 index 8ae4188a..00000000 --- a/precompiles/Precompiles.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// solhint-disable max-line-length,no-inline-assembly,reason-string -pragma solidity >=0.8.22; - -import { ISablierMerkleFactory } from "./../src//interfaces/ISablierMerkleFactory.sol"; - -/// @notice This is useful for external integrations seeking to test against the exact deployed bytecode, as recompiling -/// with via IR enabled would be time-consuming. -/// -/// The BUSL-1.1 license permits non-production usage of this file. This prohibits running the code on mainnet, -/// but allows for execution in test environments, such as a local development network or a testnet. -contract Precompiles { - bytes public constant BYTECODE_MERKLE_FACTORY = - hex"608034609357601f61600838819003918201601f19168301916001600160401b03831184841017609757808492602094604052833981010312609357516001600160a01b038116908190036093575f80546001600160a01b0319168217815560405191907fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a3615f5c90816100ac8239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063050d535a14610a1e5780633a8dda7d146109ae5780633f693dcb14610626578063474a7634146104c95780634d7c0f11146104135780635a6c72d0146103f657806375829def14610370578063a480ca7914610286578063a4ab5432146101ff578063b88c9148146101d4578063c93a6c841461017b578063d49466a8146100d15763f851a440146100a8575f80fd5b346100cd575f3660031901126100cd5760206001600160a01b035f5416604051908152f35b5f80fd5b346100cd5760403660031901126100cd576100ea610e0b565b602435906001600160a01b035f541633810361016557506001600160a01b031690815f52600260205280600160405f20805460ff811615610157575b5001556040519081527f2cd7b20ee8b62492029a3c64fecf1603b5550673e9c2a72ea38044568108a08860203392a3005b60ff19168217815585610126565b6331b339a960e21b5f526004523360245260445ffd5b346100cd5760203660031901126100cd576004356001600160a01b035f54163381036101655750806001556040519081527ff20c52fd919086f2a3380c19e51ff1fb508de65b5eb8e07c1a69695a32af651960203392a2005b346100cd5760203660031901126100cd5760206101f76101f2610e0b565b6110aa565b604051908152f35b346100cd5760203660031901126100cd57610218610e0b565b6001600160a01b035f54169033820361026f576001600160a01b0316805f5260026020525f6001604082208281550155337f633e9c50ac98dfb667e9ab9e544db6b3f26f93fbde630f500afe6bf0cd78d8ab5f80a3005b506331b339a960e21b5f526004523360245260445ffd5b346100cd5760203660031901126100cd576004356001600160a01b0381168091036100cd576001600160a01b035f5416604051907fa480ca7900000000000000000000000000000000000000000000000000000000825260048201526020816024815f865af1908115610365575f91610333575b507fbf461a00c2a56d50c1ffe10b436b0da1a2b3a86fa5154599854bbf6be334d85060206001600160a01b035f541692604051908152a3005b90506020813d60201161035d575b8161034e60209383610dc3565b810103126100cd5751826102fa565b3d9150610341565b6040513d5f823e3d90fd5b346100cd5760203660031901126100cd57610389610e0b565b5f546001600160a01b03811633810361016557506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b346100cd575f3660031901126100cd576020600154604051908152f35b346100cd5760203660031901126100cd5760043567ffffffffffffffff81116100cd57366023820112156100cd57806004013567ffffffffffffffff81116100cd573660248260061b840101116100cd575f91825b828410156104b45760248460061b8301013567ffffffffffffffff81168091036100cd5781018091116104a057600190930192610468565b634e487b7160e01b5f52601160045260245ffd5b602090670de0b6b3a764000060405191148152f35b346100cd5760603660031901126100cd5760043567ffffffffffffffff81116100cd576104fa903690600401610e77565b6040516020810160208152610524826105166040820186610fd7565b03601f198101845283610dc3565b6105596034604051809361054860208301963360601b885251809285850190610f91565b81010301601f198101835282610dc3565b51902060405161122980820182811067ffffffffffffffff8211176106125782916110e38339604081526105906040820186610fd7565b9060203391015203905ff58015610365576020917fca58fb398f60b2cc5e664a08608a6aabe7077d2684a2d82a7d5b83322fd2b2a76001600160a01b036105f293169283926105de336110aa565b604051928392608084526080840190610fd7565b9060243588840152604435604084015260608301520390a2604051908152f35b634e487b7160e01b5f52604160045260245ffd5b346100cd576101003660031901126100cd5760043567ffffffffffffffff81116100cd57610658903690600401610e77565b610660610f5d565b90610669610f73565b610671610f82565b9261067a610de5565b9260a4359067ffffffffffffffff82116100cd57366023830112156100cd57816004013567ffffffffffffffff811161061257604051926106c160208360051b0185610dc3565b8184526024602085019260061b820101903682116100cd57602401915b8183106109615750505081515f905f905b80821061092257505060405160208101956020875281604081016107139086610fd7565b03601f19810183526107259083610dc3565b6040519660208801602081528860408101610740908961105a565b03601f1981018a52610752908a610dc3565b60405192839260208401953360601b87525190816034860161077392610f91565b8301906001600160a01b038a16996bffffffffffffffffffffffff199060601b16603483015215159b8c60f81b60488301521515998a60f81b604983015264ffffffffff8c169b60d81b7fffffffffff00000000000000000000000000000000000000000000000000000016604a830152519182604f83016107f492610f91565b0160340103601b01601f198101825261080d9082610dc3565b519020604051611fef8082019082821067ffffffffffffffff83111761061257829161087691613f61843960e0815261084960e0820188610fd7565b903360208201528960408201528c60608201528a60808201528b60a082015260c08183039101528761105a565b03905ff5968715610365576108fa7f7f4d78094331349dd7faaa3e5d7de64176340a988e70586fac394de324566ce2956108d9956001600160a01b0360209b16998a996108c2336110aa565b95604051998a996101408b526101408b0190610fd7565b948e8a015260408901526060880152608087015285820360a087015261105a565b9160c084015260c43560e084015260e4356101008401526101208301520390a2604051908152f35b9091845183101561094d5760019064ffffffffff6020808660051b89010151015116019201906106ef565b634e487b7160e01b5f52603260045260245ffd5b6040833603126100cd576040519061097882610da7565b83359067ffffffffffffffff821682036100cd57826020926040945261099f838701610df9565b838201528152019201916106de565b346100cd5760203660031901126100cd576001600160a01b036109cf610e0b565b5f60206040516109de81610da7565b8281520152165f5260026020526040805f2081516109fb81610da7565b6020600160ff845416151593848452015491019081528251918252516020820152f35b346100cd576101603660031901126100cd5760043567ffffffffffffffff81116100cd57610a50903690600401610e77565b610a58610f5d565b90610a61610f73565b610a69610f82565b60a03660831901126100cd576040519260a0840184811067ffffffffffffffff82111761061257604052610a9b610de5565b845260a43567ffffffffffffffff811681036100cd57602085015260c43564ffffffffff811681036100cd57604085015260e43567ffffffffffffffff811681036100cd576060850152610104359264ffffffffff841684036100cd5760c09360808601526001600160a01b03610c1a6016604051936034898b610c09602089019460208652610b418a610b338d6040830190610fd7565b03601f1981018c528b610dc3565b610ba76040519d8e610b9e60208201809864ffffffffff6080809282815116855267ffffffffffffffff602082015116602086015282604082015116604086015267ffffffffffffffff6060820151166060860152015116910152565b60a08152610dc3565b604051988996610bc8602089019c8d3360601b9052518092898b0190610f91565b870193169e6bffffffffffffffffffffffff199060601b168584015215159a8b60f81b604884015215159b8c60f81b6049840152518093604a840190610f91565b01010301601f198101835282610dc3565b519020604051611c5580820182811067ffffffffffffffff82111761061257829161230c83396101408152610cbf60a0610c58610140840188610fd7565b923360208201528b6040820152886060820152896080820152018964ffffffffff6080809282815116855267ffffffffffffffff602082015116602086015282604082015116604086015267ffffffffffffffff6060820151166060860152015116910152565b03905ff5908115610365576020957f8ecd3adfa7cae76abab946b73ca62f03f8d77535fb2547a0f0883faef143b56093610d826001600160a01b03610d229516978897610d0b336110aa565b936040519788976101808952610180890190610fd7565b958c88015260408701526060860152608085019064ffffffffff6080809282815116855267ffffffffffffffff602082015116602086015282604082015116604086015267ffffffffffffffff6060820151166060860152015116910152565b61012435610120840152610144356101408401526101608301520390a2604051908152f35b6040810190811067ffffffffffffffff82111761061257604052565b90601f8019910116810190811067ffffffffffffffff82111761061257604052565b6084359064ffffffffff821682036100cd57565b359064ffffffffff821682036100cd57565b600435906001600160a01b03821682036100cd57565b81601f820112156100cd5780359067ffffffffffffffff82116106125760405192610e56601f8401601f191660200185610dc3565b828452602083830101116100cd57815f926020809301838601378301015290565b919060e0838203126100cd576040519060e0820182811067ffffffffffffffff82111761061257604052819380356001600160a01b03811681036100cd578352610ec360208201610df9565b602084015260408101356001600160a01b03811681036100cd576040840152606081013567ffffffffffffffff81116100cd5782610f02918301610e21565b60608401526080810135608084015260a081013567ffffffffffffffff81116100cd5782610f31918301610e21565b60a084015260c08101359167ffffffffffffffff83116100cd5760c092610f589201610e21565b910152565b602435906001600160a01b03821682036100cd57565b6044359081151582036100cd57565b6064359081151582036100cd57565b5f5b838110610fa25750505f910152565b8181015183820152602001610f93565b90602091610fcb81518092818552858086019101610f91565b601f01601f1916010190565b611057916001600160a01b03825116815264ffffffffff60208301511660208201526001600160a01b03604083015116604082015260c061104661102a606085015160e0606086015260e0850190610fb2565b6080850151608085015260a085015184820360a0860152610fb2565b9201519060c0818403910152610fb2565b90565b90602080835192838152019201905f5b8181106110775750505090565b8251805167ffffffffffffffff16855260209081015164ffffffffff16818601526040909401939092019160010161106a565b6001600160a01b0316805f52600260205260ff60405f2054165f146110db575f526002602052600160405f20015490565b506001549056fe610160806040523461044757611229803803809161001d828561045e565b83398101906040818303126104475780516001600160401b03811161044757810160e081840312610447576040519160e083016001600160401b038111848210176104075760405281516001600160a01b038116810361044757835260208201519364ffffffffff8516850361044757602084019485526100a060408401610481565b6040850190815260608401519093906001600160401b03811161044757826100c99183016104b6565b95606086019687526080820151926080870193845260a083015160018060401b03811161044757816100fc9185016104b6565b60a0880190815260c08401516001600160401b038111610447576020610142816101346101b7966101b29564ffffffffff9a016104b6565b9960c08d019a8b5201610481565b98515f80546001600160a01b0319166001600160a01b0392909216918217815560405194859290917fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a3516101a181518092858086019101610495565b81010301601f19810183528261045e565b61050a565b608052511660a0523360c05260405192631711922960e31b845260018060a01b03166004840152602083602481335afa8015610453575f9061041b575b61021e935060e0525161010052516101b26020604051836101a18295518092858086019101610495565b61012052516001600160a01b0316610140525180516001600160401b03811161040757600154600181811c911680156103fd575b60208210146103e957601f8111610386575b50602091601f8211600114610326579181925f9261031b575b50508160011b915f199060031b1c1916176001555b604051610cfc908161052d823960805181610a4f015260a05181818161018c015281816108170152818161097f0152610b1d015260c0518181816101d3015261085e015260e05181818161014c015261058f0152610100518181816103ae015261068f01526101205181610a060152610140518181816102be0152818161070a01526108f10152f35b015190505f8061027d565b601f1982169260015f52805f20915f5b85811061036e57508360019510610356575b505050811b01600155610292565b01515f1960f88460031b161c191690555f8080610348565b91926020600181928685015181550194019201610336565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f830160051c810191602084106103df575b601f0160051c01905b8181106103d45750610264565b5f81556001016103c7565b90915081906103be565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610252565b634e487b7160e01b5f52604160045260245ffd5b506020833d60201161044b575b816104356020938361045e565b810103126104475761021e92516101f4565b5f80fd5b3d9150610428565b6040513d5f823e3d90fd5b601f909101601f19168101906001600160401b0382119082101761040757604052565b51906001600160a01b038216820361044757565b5f5b8381106104a65750505f910152565b8181015183820152602001610497565b81601f820112156104475780516001600160401b03811161040757604051926104e9601f8301601f19166020018561045e565b81845260208284010111610447576105079160208085019101610495565b90565b60208151910151906020811061051e575090565b5f199060200360031b1b169056fe6080806040526004361015610012575f80fd5b5f3560e01c9081630724fda914610a39575080630f7514a2146109ee5780631686c909146108825780632dd310001461083f5780633f31ae3f146104f957806349fc73dd146103f55780634e390d3e146103d157806351e75e8b1461039757806375829def146102e257806382bfefc81461029f57806390e64d1314610285578063a480ca79146101b0578063bb4b57341461016f578063c57981b514610135578063ce516507146100f55763f851a440146100cc575f80fd5b346100f1575f3660031901126100f15760206001600160a01b035f5416604051908152f35b5f80fd5b346100f15760203660031901126100f157602061012b60043560ff6001918060081c5f526002602052161b60405f205416151590565b6040519015158152f35b346100f1575f3660031901126100f15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f1575f3660031901126100f157602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760203660031901126100f1576101c9610ac9565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803303610256575047905f80808085855af161020d610b52565b501561021e57602082604051908152f35b6001600160a01b03907f245bf0c0000000000000000000000000000000000000000000000000000000005f521660045260245260445ffd5b7f4e3ddeed000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b346100f1575f3660031901126100f157602061012b610b15565b346100f1575f3660031901126100f15760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760203660031901126100f1576102fb610ac9565b5f546001600160a01b03811633810361036857506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b7fc6cce6a4000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b346100f1575f3660031901126100f15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f1575f3660031901126100f157602064ffffffffff60035416604051908152f35b346100f1575f3660031901126100f1576040515f6001548060011c906001811680156104ef575b6020831081146104db578285529081156104b75750600114610459575b6104558361044981850382610adf565b60405191829182610a82565b0390f35b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b80821061049d57509091508101602001610449610439565b919260018160209254838588010152019101909291610485565b60ff191660208086019190915291151560051b840190910191506104499050610439565b634e487b7160e01b5f52602260045260245ffd5b91607f169161041c565b60803660031901126100f157600435602435906001600160a01b038216918281036100f157604435926fffffffffffffffffffffffffffffffff84168094036100f1576064359367ffffffffffffffff85116100f157366023860112156100f157846004013567ffffffffffffffff81116100f1578060051b95602487820101903682116100f157610589610b15565b6107e8577f00000000000000000000000000000000000000000000000000000000000000008034106107b957506105d78760ff6001918060081c5f526002602052161b60405f205416151590565b61078d57604051602081019088825286604082015285606082015260608152610601608082610adf565b519020604051602081019182526020815261061d604082610adf565b5190209261063160206040519a018a610adf565b8852602401602088015b82821061077d57505050925f935b865185101561068b5760208560051b88010151908181105f1461067a575f52602052600160405f205b940193610649565b905f52602052600160405f20610672565b85907f000000000000000000000000000000000000000000000000000000000000000003610755578261072e7f1dcd2362ae467d43bf31cbcac0526c0958b23eb063e011ab49a5179c839ed9a99460409460035464ffffffffff81161561073b575b508460081c5f526002602052855f20600160ff87161b81541790557f0000000000000000000000000000000000000000000000000000000000000000610b91565b82519182526020820152a2005b64ffffffffff19164264ffffffffff1617600355886106ed565b7fb4f06787000000000000000000000000000000000000000000000000000000005f5260045ffd5b813581526020918201910161063b565b867febe6f30d000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fa164c6b4000000000000000000000000000000000000000000000000000000005f523460045260245260445ffd5b7fdf4bae05000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445ffd5b346100f1575f3660031901126100f15760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760403660031901126100f15761089b610ac9565b602435906fffffffffffffffffffffffffffffffff82168092036100f1576001600160a01b035f5416338103610368575064ffffffffff60035416801515806109b9575b806109aa575b610950575061091582827f0000000000000000000000000000000000000000000000000000000000000000610b91565b7f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f60206001600160a01b03805f5416936040519586521693a3005b7fe2e40a0c000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445260645ffd5b506109b3610b15565b156108e5565b5062093a80810164ffffffffff81116109da5764ffffffffff1642116108df565b634e487b7160e01b5f52601160045260245ffd5b346100f1575f3660031901126100f1576104556040517f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610449604082610adf565b346100f1575f3660031901126100f157610455907f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610449604082610adf565b9190916020815282518060208301525f5b818110610ab3575060409293505f838284010152601f8019910116010190565b8060208092870101516040828601015201610a93565b600435906001600160a01b03821682036100f157565b90601f8019910116810190811067ffffffffffffffff821117610b0157604052565b634e487b7160e01b5f52604160045260245ffd5b64ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081610b4a575090565b905042101590565b3d15610b8c573d9067ffffffffffffffff8211610b015760405191610b81601f8201601f191660200184610adf565b82523d5f602084013e565b606090565b5f610bfe926001600160a01b038293604051968260208901947fa9059cbb000000000000000000000000000000000000000000000000000000008652166024890152604488015260448752610be7606488610adf565b1694519082865af1610bf7610b52565b9083610c63565b8051908115159182610c3f575b5050610c145750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b81925090602091810103126100f157602001518015908115036100f1575f80610c0b565b90610ca05750805115610c7857805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580610ce6575b610cb1575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15610ca956fea164736f6c634300081a000a6101c080604052346105ac57611c55803803809161001d82856106fe565b833981019080820361014081126105ac5781516001600160401b0381116105ac5782019160e0838503126105ac576040519360e085016001600160401b038111868210176106ab5760405283516001600160a01b03811681036105ac57855261008860208501610721565b936020860194855261009c60408201610733565b6040870190815260608201519094906001600160401b0381116105ac57836100c5918401610783565b96606081019788526080830151926080820193845260a081015160018060401b0381116105ac57856100f8918301610783565b60a0830190815260c08201519095906001600160401b0381116105ac5761011f9201610783565b9060c0810191825261013360208701610733565b60408701516001600160a01b0381169a909290918b84036105ac5761015a60608a016107c8565b9460a061016960808c016107c8565b97609f1901126105ac576040519760a089016001600160401b0381118a8210176106ab5760405261019c60a08c01610721565b89526101aa60c08c016107d5565b60208a019081529c6101be60e08d01610721565b60408b019081529a6101d36101008e016107d5565b9c60608c019d8e52610120016101e890610721565b60808c019081529d515f80546001600160a01b0319166001600160a01b0392909216918217815560405192839290917fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a3518051908160208401916020019161025292610762565b81010380825261026590602001826106fe565b61026e906107e9565b6080525164ffffffffff1660a0523360c0819052604051631711922960e31b81526001600160a01b039094166004850152839081905a92602491602094fa80156106f3575f906106bf575b6102f9935060e0525161010052516102f46020604051836102e38295518092858086019101610762565b81010301601f1981018352826106fe565b6107e9565b61012052516001600160a01b031661014052518051906001600160401b0382116106ab57600154600181811c911680156106a1575b602082101461068d57601f811161062a575b50602090601f83116001146105bb5764ffffffffff9695949392915f91836105b0575b50508160011b915f199060031b1c1916176001555b61016052610180526101a05251169071ffffffffff000000000000000000000000006004549565010000000000600160681b03905160281b16915160681b1692600160901b600160d01b03905160901b169364ffffffffff60d01b905160d01b169464ffffffffff60d01b1992600160901b600160d01b03199160018060901b0319161716171617171760045560018060a01b036101405116604051905f806020840163095ea7b360e01b815285602486015281196044860152604485526104416064866106fe565b84519082855af161045061080b565b81610575575b508061056b575b15610526575b604051611349908161090c823960805181611043015260a05181818161023001528181610c9701528181610f73015261112d015260c0518181816102770152610cde015260e0518181816101b40152610673015261010051818181610495015261077301526101205181818161089d0152610ffa0152610140518181816103a50152818161091c0152610e730152610160518181816103620152610ab4015261018051818181610178015261094d01526101a0518181816101ee01526109770152f35b61055e610563936040519063095ea7b360e01b602083015260248201525f6044820152604481526105586064826106fe565b8261083a565b61083a565b5f8080610463565b50803b151561045d565b805180159250821561058a575b50505f610456565b81925090602091810103126105ac5760206105a591016107c8565b5f80610582565b5f80fd5b015190505f80610363565b90601f1983169160015f52815f20925f5b818110610612575091600193918564ffffffffff9a9998979694106105fa575b505050811b01600155610378565b01515f1960f88460031b161c191690555f80806105ec565b929360206001819287860151815501950193016105cc565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610683575b601f0160051c01905b8181106106785750610340565b5f815560010161066b565b9091508190610662565b634e487b7160e01b5f52602260045260245ffd5b90607f169061032e565b634e487b7160e01b5f52604160045260245ffd5b506020833d6020116106eb575b816106d9602093836106fe565b810103126105ac576102f992516102b9565b3d91506106cc565b6040513d5f823e3d90fd5b601f909101601f19168101906001600160401b038211908210176106ab57604052565b519064ffffffffff821682036105ac57565b51906001600160a01b03821682036105ac57565b6001600160401b0381116106ab57601f01601f191660200190565b5f5b8381106107735750505f910152565b8181015183820152602001610764565b81601f820112156105ac57805161079981610747565b926107a760405194856106fe565b818452602082840101116105ac576107c59160208085019101610762565b90565b519081151582036105ac57565b51906001600160401b03821682036105ac57565b6020815191015190602081106107fd575090565b5f199060200360031b1b1690565b3d15610835573d9061081c82610747565b9161082a60405193846106fe565b82523d5f602084013e565b606090565b5f806108629260018060a01b03169360208151910182865af161085b61080b565b90836108ad565b805190811515918261088a575b50506108785750565b635274afe760e01b5f5260045260245ffd5b81925090602091810103126105ac5760206108a591016107c8565b155f8061086f565b906108d157508051156108c257805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580610902575b6108e2575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b156108da56fe6080806040526004361015610012575f80fd5b5f3560e01c9081630724fda91461102d575080630f7514a214610fe25780631686c90914610db657806326fadbe214610d025780632dd3100014610cbf5780633f31ae3f146105e857806349fc73dd146104dc5780634e390d3e146104b857806351e75e8b1461047e57806375829def146103c957806382bfefc814610386578063845aef4b1461034357806390e64d1314610329578063a480ca7914610254578063bb4b573414610213578063bf44497a146101d7578063c57981b51461019d578063cbe9e5ef14610161578063ce516507146101215763f851a440146100f8575f80fd5b3461011d575f36600319011261011d5760206001600160a01b035f5416604051908152f35b5f80fd5b3461011d57602036600319011261011d57602061015760043560ff6001918060081c5f526002602052161b60405f205416151590565b6040519015158152f35b3461011d575f36600319011261011d5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b3461011d575f36600319011261011d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461011d575f36600319011261011d5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b3461011d575f36600319011261011d57602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d57602036600319011261011d5761026d6110b5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168033036102fa575047905f80808085855af16102b1611162565b50156102c257602082604051908152f35b6001600160a01b03907f245bf0c0000000000000000000000000000000000000000000000000000000005f521660045260245260445ffd5b7f4e3ddeed000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b3461011d575f36600319011261011d576020610157611125565b3461011d575f36600319011261011d5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d575f36600319011261011d5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d57602036600319011261011d576103e26110b5565b5f546001600160a01b03811633810361044f57506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b7fc6cce6a4000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b3461011d575f36600319011261011d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461011d575f36600319011261011d57602064ffffffffff60035416604051908152f35b3461011d575f36600319011261011d576040515f6001548060011c906001811680156105de575b6020831081146105ca578285529081156105a65750600114610548575b6105448361053081850382611103565b604051918291602083526020830190611076565b0390f35b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b80821061058c57509091508101602001610530610520565b919260018160209254838588010152019101909291610574565b60ff191660208086019190915291151560051b840190910191506105309050610520565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610503565b608036600319011261011d57600435602435906001600160a01b03821680920361011d576044356001600160801b03811680910361011d576064359067ffffffffffffffff821161011d573660238301121561011d57816004013567ffffffffffffffff811161011d578060051b926024848201019036821161011d5761066d611125565b610c68577f0000000000000000000000000000000000000000000000000000000000000000803410610c3957506106bb8660ff6001918060081c5f526002602052161b60405f205416151590565b610c0d576040516020810190878252886040820152856060820152606081526106e5608082611103565b5190206040516020810191825260208152610701604082611103565b519020926107156020604051970187611103565b8552602401602085015b828210610bfd57505050935f945b835186101561076f5760208660051b85010151908181105f1461075e575f52602052600160405f205b95019461072d565b905f52602052600160405f20610756565b84907f000000000000000000000000000000000000000000000000000000000000000003610bd55760035464ffffffffff811615610bbb575b508060081c5f52600260205260405f20600160ff83161b8154179055604051926107d1846110e7565b5f808552602085015260045464ffffffffff811680610bb4575064ffffffffff421685525b5f9064ffffffffff8160681c1680610b99575b5064ffffffffff61082381885116828460d01c16906111a1565b16602087015261087a61086867ffffffffffffffff60405193610845856110e7565b5f85525f60208601526001600160801b0361086d610868848460281c168a611202565b6111bd565b16855260901c1685611202565b916001600160801b0360208301931683526001600160a01b035f541692604051927f00000000000000000000000000000000000000000000000000000000000000006020850152602084526108d0604085611103565b604051936108dd856110e7565b5f85525f602086015260405195610120870187811067ffffffffffffffff821117610b855760405286526020860199898b5260408701888152606088017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260808901907f00000000000000000000000000000000000000000000000000000000000000001515825260a08a01927f00000000000000000000000000000000000000000000000000000000000000001515845260c08b0194855260e08b019586526101008b01998a526040519e8f9b7f7a695841000000000000000000000000000000000000000000000000000000008d5260048d0160809052516001600160a01b031660848d0152516001600160a01b031660a48c0152516001600160801b031660c48b0152516001600160a01b031660e48a015251151561010489015251151561012488015251805164ffffffffff166101448801526020015164ffffffffff1661016487015251610184860161016090526101e48601610a6991611076565b935180516001600160a01b03166101a4870152602001516101c4860152516001600160801b03166024850152516001600160801b0316604484015264ffffffffff16606483015203847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691815a6020945f91f1938415610b7a575f94610b26575b507f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d9160409182519182526020820152a3005b9093506020813d602011610b72575b81610b4260209383611103565b8101031261011d5751927f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d610af3565b3d9150610b35565b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b610bad91925064ffffffffff8751166111a1565b9086610809565b85526107f6565b64ffffffffff19164264ffffffffff1617600355836107a8565b7fb4f06787000000000000000000000000000000000000000000000000000000005f5260045ffd5b813581526020918201910161071f565b857febe6f30d000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fa164c6b4000000000000000000000000000000000000000000000000000000005f523460045260245260445ffd5b7fdf4bae05000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445ffd5b3461011d575f36600319011261011d5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461011d575f36600319011261011d575f6080604051610d21816110cb565b828152826020820152826040820152826060820152015260a0604051610d46816110cb565b64ffffffffff60045467ffffffffffffffff828216938481528360208201838560281c168152836040840191838760681c1683528360806060870196848a60901c168852019760d01c16875260405198895251166020880152511660408601525116606084015251166080820152f35b3461011d57604036600319011261011d57610dcf6110b5565b6024356001600160801b03811680910361011d576001600160a01b035f541633810361044f575064ffffffffff6003541680151580610fad575b80610f9e575b610f445750604051610ea95f806001600160a01b0360208501967fa9059cbb000000000000000000000000000000000000000000000000000000008852169586602486015285604486015260448552610e69606486611103565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001694519082865af1610ea2611162565b90836112b0565b8051908115159182610f20575b5050610ef557507f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f60206001600160a01b035f541692604051908152a3005b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b819250906020918101031261011d576020015180159081150361011d578480610eb6565b7fe2e40a0c000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445260645ffd5b50610fa7611125565b15610e0f565b5062093a80810164ffffffffff8111610fce5764ffffffffff164211610e09565b634e487b7160e01b5f52601160045260245ffd5b3461011d575f36600319011261011d576105446040517f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610530604082611103565b3461011d575f36600319011261011d57610544907f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610530604082611103565b91908251928382525f5b8481106110a0575050825f602080949584010152601f8019910116010190565b80602080928401015182828601015201611080565b600435906001600160a01b038216820361011d57565b60a0810190811067ffffffffffffffff821117610b8557604052565b6040810190811067ffffffffffffffff821117610b8557604052565b90601f8019910116810190811067ffffffffffffffff821117610b8557604052565b64ffffffffff7f000000000000000000000000000000000000000000000000000000000000000016801515908161115a575090565b905042101590565b3d1561119c573d9067ffffffffffffffff8211610b855760405191611191601f8201601f191660200184611103565b82523d5f602084013e565b606090565b9064ffffffffff8091169116019064ffffffffff8211610fce57565b6001600160801b0381116111d7576001600160801b031690565b7f4916adce000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b9091905f198382098382029182808310920391808303921461129f57670de0b6b3a764000082101561126f577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106699394670de0b6b3a7640000910990828211900360ee1b910360121c170290565b84907f5173648d000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050670de0b6b3a764000090049150565b906112ed57508051156112c557805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580611333575b6112fe575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156112f656fea164736f6c634300081a000a610200806040523461053557611fef803803809161001d82856107af565b833981019060e0818303126105355780516001600160401b0381116105355781019060e082840312610535576040519160e083016001600160401b038111848210176105ef5760405280516001600160a01b0381168103610535578352610086602082016107d2565b906020840191825261009a604082016107e4565b6040850190815260608201519094906001600160401b03811161053557866100c3918401610834565b6060820190815260808381015190830190815260a08401519192916001600160401b03811161053557886100f8918601610834565b60a0830190815260c085015190946001600160401b03821161053557610120918a9101610834565b60c08301908152610133602088016107e4565b6040880151969092906001600160a01b03881688036105355761015860608a01610879565b9661016560808b01610879565b9a61017260a08c016107d2565b60c08c0151909b6001600160401b03821161053557018d601f82011215610535578051906001600160401b0382116105ef576040519e8f8360051b6020016101ba90826107af565b8381526020019260061b82016020019181831161053557602001925b828410610753575050505064ffffffffff929161025a602061025f9360018060a01b039051168060018060a01b03195f5416175f556040519384915f7fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a35161024981518092858086019101610813565b81010301601f1981018352826107af565b61089a565b608052511660a0523360c05260405192631711922960e31b845260018060a01b03166004840152602083602481335afa8015610748575f90610714575b6102c6935060e05251610100525161025a6020604051836102498295518092858086019101610813565b61012052516001600160a01b031661014052518051906001600160401b0382116105ef5760015490600182811c9216801561070a575b60208310146106f65781601f849311610688575b50602090601f8311600114610622575f92610617575b50508160011b915f199060031b1c1916176001555b61018052610160526101a0526101c0528051905f915f915b81831061053957836101e05260018060a01b03610140511660018060a01b03610160511690604051905f806020840163095ea7b360e01b815285602486015281196044860152604485526103a86064866107af565b84519082855af16103b76108bc565b816104fe575b50806104f4575b156104af575b60405161163290816109bd823960805181611283015260a05181818161030001528181610f8b015281816111b30152611369015260c0518181816103470152610fd2015260e05181818161020b01526107870152610100518181816105a9015261088e015261012051818181610a6c015261123a0152610140518181816104b901528181610af101526110b30152610160518181816104760152610c910152610180518181816101cf0152610b2201526101a051818181610194015261091c01526101c0518181816102be0152610b4c01526101e05181818161041901526108ea0152f35b6104e76104ec936040519063095ea7b360e01b602083015260248201525f6044820152604481526104e16064826107af565b826108eb565b6108eb565b8080806103ca565b50803b15156103c4565b8051801592508215610513575b5050846103bd565b819250906020918101031261053557602061052e9101610879565b848061050b565b5f80fd5b91929091906001600160401b036105508584610886565b5151166001600160401b039182160190811161060357926105718183610886565b519060045491680100000000000000008310156105ef5760018301806004558310156105db5760019260045f5260205f200190838060401b038151166cffffffffff00000000000000006020845493015160401b1691858060681b03191617179055019190610353565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b015190505f80610326565b60015f9081528281209350601f198516905b8181106106705750908460019594939210610658575b505050811b0160015561033b565b01515f1960f88460031b161c191690555f808061064a565b92936020600181928786015181550195019301610634565b60015f529091507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c810191602085106106ec575b90601f859493920160051c01905b8181106106de5750610310565b5f81558493506001016106d1565b90915081906106c3565b634e487b7160e01b5f52602260045260245ffd5b91607f16916102fc565b506020833d602011610740575b8161072e602093836107af565b81010312610535576102c6925161029c565b3d9150610721565b6040513d5f823e3d90fd5b6040848303126105355760408051919082016001600160401b038111838210176105ef576040528451906001600160401b03821682036105355782602092604094526107a08388016107d2565b838201528152019301926101d6565b601f909101601f19168101906001600160401b038211908210176105ef57604052565b519064ffffffffff8216820361053557565b51906001600160a01b038216820361053557565b6001600160401b0381116105ef57601f01601f191660200190565b5f5b8381106108245750505f910152565b8181015183820152602001610815565b81601f8201121561053557805161084a816107f8565b9261085860405194856107af565b81845260208284010111610535576108769160208085019101610813565b90565b5190811515820361053557565b80518210156105db5760209160051b010190565b6020815191015190602081106108ae575090565b5f199060200360031b1b1690565b3d156108e6573d906108cd826107f8565b916108db60405193846107af565b82523d5f602084013e565b606090565b5f806109139260018060a01b03169360208151910182865af161090c6108bc565b908361095e565b805190811515918261093b575b50506109295750565b635274afe760e01b5f5260045260245ffd5b81925090602091810103126105355760206109569101610879565b155f80610920565b90610982575080511561097357805190602001fd5b630a12f52160e11b5f5260045ffd5b815115806109b3575b610993575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561098b56fe6080806040526004361015610012575f80fd5b5f3560e01c9081630724fda91461126d575080630f7514a2146112225780631686c90914610ff65780632dd3100014610fb35780633f31ae3f146106fc57806349fc73dd146105f05780634e390d3e146105cc57806351e75e8b1461059257806375829def146104dd57806382bfefc81461049a578063845aef4b1461045757806390e64d131461043d578063936c63d9146103f9578063a480ca7914610324578063bb4b5734146102e3578063bf44497a146102a7578063bf4ed03f1461022e578063c57981b5146101f4578063cbe9e5ef146101b8578063ce36b33514610177578063ce516507146101375763f851a4401461010e575f80fd5b34610133575f3660031901126101335760206001600160a01b035f5416604051908152f35b5f80fd5b3461013357602036600319011261013357602061016d60043560ff6001918060081c5f526002602052161b60405f205416151590565b6040519015158152f35b34610133575f36600319011261013357602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133575f3660031901126101335760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b34610133575f3660031901126101335760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610133575f366003190112610133576102466113dd565b6040518091602082016020835281518091526020604084019201905f5b818110610271575050500390f35b8251805167ffffffffffffffff16855260209081015164ffffffffff168186015286955060409094019390920191600101610263565b34610133575f3660031901126101335760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b34610133575f36600319011261013357602060405164ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101335760203660031901126101335761033d6112f5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168033036103ca575047905f80808085855af161038161139e565b501561039257602082604051908152f35b6001600160a01b03907f245bf0c0000000000000000000000000000000000000000000000000000000005f521660045260245260445ffd5b7f4e3ddeed000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b34610133575f36600319011261013357602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133575f36600319011261013357602061016d611361565b34610133575f3660031901126101335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133575f3660031901126101335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610133576020366003190112610133576104f66112f5565b5f546001600160a01b03811633810361056357506001600160a01b037fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116175f55337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf805f80a3005b7fc6cce6a4000000000000000000000000000000000000000000000000000000005f526004523360245260445ffd5b34610133575f3660031901126101335760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610133575f36600319011261013357602064ffffffffff60035416604051908152f35b34610133575f366003190112610133576040515f6001548060011c906001811680156106f2575b6020831081146106de578285529081156106ba575060011461065c575b6106588361064481850382611327565b6040519182916020835260208301906112b6565b0390f35b91905060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f905b8082106106a057509091508101602001610644610634565b919260018160209254838588010152019101909291610688565b60ff191660208086019190915291151560051b840190910191506106449050610634565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610617565b608036600319011261013357600435602435906001600160a01b03821680920361013357604435906001600160801b03821691828103610133576064359367ffffffffffffffff851161013357366023860112156101335784600401359467ffffffffffffffff86116101335760248660051b82010136811161013357610781611361565b610f5c577f0000000000000000000000000000000000000000000000000000000000000000803410610f2d57506107cf8560ff6001918060081c5f526002602052161b60405f205416151590565b610f01576040516020810190868252846040820152876060820152606081526107f9608082611327565b5190206040516020810191825260208152610815604082611327565b5190209161082288611349565b97610830604051998a611327565b8852602401602088015b828210610ef157505050925f935b865185101561088a5761085b8588611492565b519081811015610879575f52602052600160405f205b940193610848565b905f52602052600160405f20610871565b85907f000000000000000000000000000000000000000000000000000000000000000003610ec95760035464ffffffffff811615610eaf575b508160081c5f52600260205260405f20600160ff84161b815417905567ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016670de0b6b3a76400008103610e8457507f000000000000000000000000000000000000000000000000000000000000000064ffffffffff8116610e7e575064ffffffffff4216935b61095a6113dd565b9081519161096783611349565b926109756040519485611327565b808452601f1961098482611349565b015f5b818110610e5b5750506109b66109b167ffffffffffffffff6109a885611471565b515116876114eb565b6114a6565b64ffffffffff8060206109c886611471565b510151168a0116906001600160801b03604051916109e58361130b565b169182825260208201526109f886611471565b52610a0285611471565b50916001905b828210610dc7575050846001600160801b03831610610d9c575b50505064ffffffffff6020610a3b5f1984510184611492565b51015116946001600160a01b035f54169564ffffffffff60405192610a5f8461130b565b16825260208201526040517f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610a9f604082611327565b60405191610aac8361130b565b5f83525f602084015260405197610120890189811067ffffffffffffffff821117610d88576040999594939299528452602084019787895260408501868152606086017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260808701907f00000000000000000000000000000000000000000000000000000000000000001515825260a08801927f00000000000000000000000000000000000000000000000000000000000000001515845260c0890194855260e0890195865261010089019687526040519c8d997f7ee21391000000000000000000000000000000000000000000000000000000008b5260048b0160409052516001600160a01b031660448b0152516001600160a01b031660648a0152516001600160801b03166084890152516001600160a01b031660a488015251151560c487015251151560e486015251805164ffffffffff166101048601526020015164ffffffffff1661012485015251610144840161016090526101a48401610c3c916112b6565b905180516001600160a01b03166101648501526020015161018484015260031983820301602484015281519081815260200191602001905f5b818110610d5357505050908060209203815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1938415610d48575f94610cf4575b507f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d9160409182519182526020820152a3005b9093506020813d602011610d40575b81610d1060209383611327565b810103126101335751927f28b58397e03322f670d6b223cc863f8c148e368b8b615412e6798a641a22842d610cc1565b3d9150610d03565b6040513d5f823e3d90fd5b825180516001600160801b0316855260209081015164ffffffffff168186015289955060409094019390920191600101610c75565b634e487b7160e01b5f52604160045260245ffd5b6001600160801b0391610db383925f190186611492565b519303168183511601169052858080610a22565b90926001600160801b03600191610df66109b167ffffffffffffffff610ded8988611492565b5151168b6114eb565b9064ffffffffff806020610e0d5f198b018d611492565b51015116816020610e1e8b8a611492565b51015116011660405190610e318261130b565b84841682526020820152610e45888b611492565b52610e50878a611492565b500116930190610a08565b602090604051610e6a8161130b565b5f81525f8382015282828901015201610987565b93610952565b7f36d385ef000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b64ffffffffff19164264ffffffffff1617600355846108c3565b7fb4f06787000000000000000000000000000000000000000000000000000000005f5260045ffd5b813581526020918201910161083a565b847febe6f30d000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fa164c6b4000000000000000000000000000000000000000000000000000000005f523460045260245260445ffd5b7fdf4bae05000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445ffd5b34610133575f3660031901126101335760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101335760403660031901126101335761100f6112f5565b6024356001600160801b038116809103610133576001600160a01b035f5416338103610563575064ffffffffff60035416801515806111ed575b806111de575b61118457506040516110e95f806001600160a01b0360208501967fa9059cbb0000000000000000000000000000000000000000000000000000000088521695866024860152856044860152604485526110a9606486611327565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001694519082865af16110e261139e565b9083611599565b8051908115159182611160575b505061113557507f2e9d425ba8b27655048400b366d7b6a1f7180ebdb088e06bb7389704860ffe1f60206001600160a01b035f541692604051908152a3005b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b819250906020918101031261013357602001518015908115036101335784806110f6565b7fe2e40a0c000000000000000000000000000000000000000000000000000000005f524260045264ffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660245260445260645ffd5b506111e7611361565b1561104f565b5062093a80810164ffffffffff811161120e5764ffffffffff164211611049565b634e487b7160e01b5f52601160045260245ffd5b34610133575f366003190112610133576106586040517f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610644604082611327565b34610133575f36600319011261013357610658907f0000000000000000000000000000000000000000000000000000000000000000602082015260208152610644604082611327565b91908251928382525f5b8481106112e0575050825f602080949584010152601f8019910116010190565b806020809284010151828286010152016112c0565b600435906001600160a01b038216820361013357565b6040810190811067ffffffffffffffff821117610d8857604052565b90601f8019910116810190811067ffffffffffffffff821117610d8857604052565b67ffffffffffffffff8111610d885760051b60200190565b64ffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015159081611396575090565b905042101590565b3d156113d8573d9067ffffffffffffffff8211610d8857604051916113cd601f8201601f191660200184611327565b82523d5f602084013e565b606090565b600454906113ea82611349565b916113f86040519384611327565b80835260045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602085015b8383106114345750505050565b6001602081926040516114468161130b565b64ffffffffff865467ffffffffffffffff8116835260401c1683820152815201920192019190611427565b80511561147e5760200190565b634e487b7160e01b5f52603260045260245ffd5b805182101561147e5760209160051b010190565b6001600160801b0381116114c0576001600160801b031690565b7f4916adce000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b9091905f198382098382029182808310920391808303921461158857670de0b6b3a7640000821015611558577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106699394670de0b6b3a7640000910990828211900360ee1b910360121c170290565b84907f5173648d000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050670de0b6b3a764000090049150565b906115d657508051156115ae57805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b8151158061161c575b6115e7575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156115df56fea164736f6c634300081a000aa164736f6c634300081a000a"; - - /// @notice Deploys {SablierMerkleFactory} from precompiled bytecode. - function deployMerkleFactory(address initialAdmin) public returns (ISablierMerkleFactory factory) { - bytes memory creationBytecode = bytes.concat(BYTECODE_MERKLE_FACTORY, abi.encode(initialAdmin)); - assembly { - factory := create(0, add(creationBytecode, 0x20), mload(creationBytecode)) - } - require(address(factory) != address(0), "Lockup Precompiles: deployment failed for MerkleFactory contract"); - } -} diff --git a/shell/update-precompiles.sh b/shell/update-precompiles.sh deleted file mode 100755 index 62953d07..00000000 --- a/shell/update-precompiles.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -# Pre-requisites: -# - foundry (https://getfoundry.sh) -# - jq (https://stedolan.github.io/jq) -# - sd (https://github.com/chmln/sd) - -# Strict mode: https://gist.github.com/vncsna/64825d5609c146e80de8b1fd623011ca -set -euo pipefail - -# Compile the contracts with Forge -FOUNDRY_PROFILE=optimized forge build - -# Retrieve the raw bytecodes, removing the "0x" prefix -merkle_factory=$(cat out-optimized/SablierMerkleFactory.sol/SablierMerkleFactory.json | jq -r '.bytecode.object' | cut -c 3-) - -precompiles_path="precompiles/Precompiles.sol" -if [ ! -f $precompiles_path ]; then - echo "Precompiles file does not exist" - exit 1 -fi - -# Replace the current bytecodes -sd "(BYTECODE_MERKLE_FACTORY =)[^;]+;" "\$1 hex\"$merkle_factory\";" $precompiles_path - -# Reformat the code with Forge -forge fmt $precompiles_path diff --git a/tests/utils/Precompiles.t.sol b/tests/utils/Precompiles.t.sol deleted file mode 100644 index 010cb999..00000000 --- a/tests/utils/Precompiles.t.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >=0.8.22 <0.9.0; - -import { Precompiles } from "precompiles/Precompiles.sol"; -import { LibString } from "solady/src/utils/LibString.sol"; -import { Base_Test } from "./../Base.t.sol"; - -contract Precompiles_Test is Base_Test { - using LibString for address; - - Precompiles internal precompiles = new Precompiles(); - - modifier onlyTestOptimizedProfile() { - if (isTestOptimizedProfile()) { - _; - } - } - - function test_DeployMerkleFactory() external onlyTestOptimizedProfile { - address actualFactory = address(precompiles.deployMerkleFactory(users.admin)); - address expectedFactory = address(deployOptimizedMerkleFactory(users.admin)); - assertEq(actualFactory.code, expectedFactory.code, "bytecodes mismatch"); - } -}