From f02faebdaffe9527bb1c2620fa3dde7f36cd1428 Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Wed, 11 Feb 2026 15:35:01 +0530 Subject: [PATCH 1/7] feat: introduce dynamic mining pass price DEV-1084 --- .gitignore | 5 + .vscode/settings.json | 5 + foundry.lock | 20 + package.json | 4 + scripts/simulation/Season30_TierPricing.csv | 32 ++ ...uidMining_Season30_Analysis_2026-01-30.csv | 312 +++++++++++++ scripts/simulation/analyzeUtilization.ts | 69 +++ scripts/simulation/exportSeasonAnalysis.ts | 282 ++++++++++++ scripts/simulation/miningPassPricing.ts | 414 +++++++++++++++++ scripts/simulation/miningPassROIAnalysis.ts | 426 ++++++++++++++++++ scripts/simulation/unprofitableAnalysis.ts | 206 +++++++++ src/facets/DiamondManagerFacet.sol | 146 +++++- src/libraries/AppStorage.sol | 4 + src/upgradeInitializers/DiamondInit.sol | 27 +- .../Facets/MiningPassDynamicPricing.t.sol | 392 ++++++++++++++++ test/foundry/utils/DiamondTest.sol | 16 +- yarn.lock | 99 ++++ 17 files changed, 2435 insertions(+), 24 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 foundry.lock create mode 100644 scripts/simulation/Season30_TierPricing.csv create mode 100644 scripts/simulation/VaporFi_LiquidMining_Season30_Analysis_2026-01-30.csv create mode 100644 scripts/simulation/analyzeUtilization.ts create mode 100644 scripts/simulation/exportSeasonAnalysis.ts create mode 100644 scripts/simulation/miningPassPricing.ts create mode 100644 scripts/simulation/miningPassROIAnalysis.ts create mode 100644 scripts/simulation/unprofitableAnalysis.ts create mode 100644 test/foundry/Facets/MiningPassDynamicPricing.t.sol diff --git a/.gitignore b/.gitignore index b519c99..27becb6 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,8 @@ node_modules/ # IDE .idea + +# Misc +.DS_Store +.archive/ + diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a8c2003 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "python-envs.defaultEnvManager": "ms-python.python:conda", + "python-envs.defaultPackageManager": "ms-python.python:conda", + "python-envs.pythonProjects": [] +} \ No newline at end of file diff --git a/foundry.lock b/foundry.lock new file mode 100644 index 0000000..d398b94 --- /dev/null +++ b/foundry.lock @@ -0,0 +1,20 @@ +{ + "lib/clouds": { + "branch": { + "name": "main", + "rev": "50e831db068af977cd9c4169ecf1a6119934a034" + } + }, + "lib/forge-std": { + "branch": { + "name": "master", + "rev": "520f86e57e0682bdac282748a33a138a47f1d552" + } + }, + "lib/openzeppelin-contracts": { + "rev": "3f610ebc25480bf6145e519c96e2f809996db8ed" + }, + "lib/solmate": { + "rev": "1b3adf677e7e383cc684b5d5bd441da86bf4bf1c" + } +} \ No newline at end of file diff --git a/package.json b/package.json index fabb0ca..667bd54 100644 --- a/package.json +++ b/package.json @@ -66,5 +66,9 @@ "typechain": "^8.2.0", "typescript": "5.1.6", "yargs": "^17.7.2" + }, + "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610", + "dependencies": { + "viem": "2.45.1" } } diff --git a/scripts/simulation/Season30_TierPricing.csv b/scripts/simulation/Season30_TierPricing.csv new file mode 100644 index 0000000..1f68871 --- /dev/null +++ b/scripts/simulation/Season30_TierPricing.csv @@ -0,0 +1,32 @@ +"VaporFi Liquid Mining - Dynamic Pricing Analysis" +"Season 30 (VAPE Price: $0.16)" +"" +"Formula:","dynamicFee = originalFee × (currentVAPEPrice / referenceVAPEPrice)" +"Reference VAPE Price:","$0.606","(Oct 16, 2023 - when original fees were set)" +"Current VAPE Price:","$0.16","(Season 30)" +"Multiplier:","0.264","(0.16 / 0.606)" +"" +"TIER PRICING TABLE" +"Tier","Deposit Limit (VPND)","Original Fee (USD)","Dynamic Fee (USD)","Reduction %" +"0","5,000","$0.00","$0.00","-" +"1","10,000","$0.50","$0.13","74%" +"2","25,000","$1.00","$0.26","74%" +"3","60,000","$2.00","$0.53","74%" +"4","150,000","$4.00","$1.06","74%" +"5","350,000","$8.00","$2.11","74%" +"6","800,000","$15.00","$3.96","74%" +"7","1,800,000","$30.00","$7.92","74%" +"8","4,500,000","$50.00","$13.20","74%" +"9","12,000,000","$75.00","$19.80","74%" +"10","Unlimited","$100.00","$26.40","74%" +"" +"IMPACT SUMMARY (Season 30 Data)" +"Metric","Original Pricing","Dynamic Pricing" +"Total Fees Collected","$1,305.00","$344.55" +"Profitable Users","33/112 (29.5%)","109/112 (97.3%)" +"Average ROI","0.93x","3.51x" +"" +"NOTES" +"- Dynamic pricing scales fees proportionally with VAPE price" +"- When VAPE price recovers, fees will increase accordingly" +"- Tier 0 remains free (no mining pass required)" diff --git a/scripts/simulation/VaporFi_LiquidMining_Season30_Analysis_2026-01-30.csv b/scripts/simulation/VaporFi_LiquidMining_Season30_Analysis_2026-01-30.csv new file mode 100644 index 0000000..5dc933a --- /dev/null +++ b/scripts/simulation/VaporFi_LiquidMining_Season30_Analysis_2026-01-30.csv @@ -0,0 +1,312 @@ +"Wallet Address","Tier","Tier Deposit Limit (VPND)","Deposited VPND","Wallet Points","Combined Points","VAPE Claimed","VAPE Value (USD)","Original Fee (USD)","Dynamic Fee (USD)","Original ROI (x)","Dynamic ROI (x)","Original Profit/Loss (USD)","Dynamic Profit/Loss (USD)","Original Profitable?","Dynamic Profitable?" +"0xd3dff402b74563b559c620a5c56ad2f048587c1c","9","12,000,000","11,500,000","334,777,864.42","334,339,186.05","1787.4742","286.00","75.00","19.80","3.81","14.44","211.00","266.19","Yes","Yes" +"0xd5c69e00b28034068bceba48a64213e52ef7b1e0","9","12,000,000","7,145,342.69","216,662,395.74","216,244,198.03","1156.8221","185.09","75.00","19.80","2.47","9.35","110.09","165.29","Yes","Yes" +"0x97adf680aaaf803018c0204cf1be1da258cb14ae","9","12,000,000","7,061,878.63","216,422,964.22","216,005,077.82","1155.5438","184.89","75.00","19.80","2.47","9.34","109.89","165.09","Yes","Yes" +"0x7ce921b5ae5afd8063f70b40d44097f6d4c8871f","9","12,000,000","6,975,059.9","211,606,700.02","211,462,432.6","1129.8283","180.77","75.00","19.80","2.41","9.13","105.77","160.97","Yes","Yes" +"0x5d0fce0faea808649c3d4ce3ac9f841b6295e1af","9","12,000,000","5,230,648.57","161,333,616.71","160,897,748.83","861.4061","137.82","75.00","19.80","1.84","6.96","62.82","118.02","Yes","Yes" +"0x957a200dc62e4378ffddc93ae6cfea39601e5831","8","4,500,000","4,500,000","135,315,741.77","234,606,938.3","722.4892","115.60","50.00","13.20","2.31","8.76","65.60","102.40","Yes","Yes" +"0x3a8f7b4324610eead8f6b34f8717e1f18bac4c46","8","4,500,000","4,500,000","135,306,234","135,117,000","722.4385","115.59","50.00","13.20","2.31","8.76","65.59","102.39","Yes","Yes" +"0xd9366e6595ab1a5c137c605a6b90737aa8725f0f","8","4,500,000","3,286,160.72","99,483,206.6","234,606,938.3","531.1691","84.99","50.00","13.20","1.70","6.44","34.99","71.79","Yes","Yes" +"0xb6e87d208c8bf543ca5aedc452a7eafe442fae10","8","4,500,000","2,751,059.48","82,531,784.42","0","440.6607","70.51","50.00","13.20","1.41","5.34","20.51","57.30","Yes","Yes" +"0x11b248f27a753ec44ac2c699445e20d5c7f7aa0a","7","1,800,000","1,799,999","55,187,362.96","55,084,394.17","294.6610","47.15","30.00","7.92","1.57","5.95","17.15","39.22","Yes","Yes" +"0xa15704171245d148206a8f1240eb51cf3dadc368","7","1,800,000","1,800,000","52,200,000","0","278.7106","44.59","30.00","7.92","1.49","5.63","14.59","36.67","Yes","Yes" +"0x81fe73a6fb28c49c14c82fcae2a4fe19f57d150c","7","1,800,000","1,800,000","52,200,000","0","278.7106","44.59","30.00","7.92","1.49","5.63","14.59","36.67","Yes","Yes" +"0x9e4c71b315982ad19d218ca99fa29c1d2f600119","7","1,800,000","1,800,000","50,400,000","50,400,000","269.0999","43.06","30.00","7.92","1.44","5.44","13.06","35.14","Yes","Yes" +"0x8f60fa5a89b9aa01ba6b32ca1641e69ae8d0bafb","7","1,800,000","1,510,628.39","44,322,747.04","44,240,308.93","236.6518","37.86","30.00","7.92","1.26","4.78","7.86","29.94","Yes","Yes" +"0x98a23fca1b642b54a95565503e6662bb814bb824","7","1,800,000","1,800,000","38,477,001.65","54,677,001.65","205.4397","32.87","30.00","7.92","1.10","4.15","2.87","24.95","Yes","Yes" +"0xed5f92f2c2d562f981a13521d421f5a1ff927f59","6","800,000","800,000","24,800,196.73","24,733,183.81","132.4153","21.19","15.00","3.96","1.41","5.35","6.19","17.23","Yes","Yes" +"0x64456ad298f0972daf26aa1d23af93a2962eba0e","6","800,000","800,000","24,656,239.76","24,608,622.51","131.6467","21.06","15.00","3.96","1.40","5.32","6.06","17.10","Yes","Yes" +"0x77847c5da38dc3d385b1753392c0b7ce64536930","6","800,000","800,000","24,655,918.85","24,655,918.85","131.6450","21.06","15.00","3.96","1.40","5.32","6.06","17.10","Yes","Yes" +"0x1a7896295222038d2aeeb8b621d32bd9cb88d4e2","6","800,000","800,000","24,500,905.26","24,453,598.07","130.8173","20.93","15.00","3.96","1.40","5.29","5.93","16.97","Yes","Yes" +"0xf9c9cdf8d95c211188313f7d3ec29128fb900872","6","800,000","800,000","24,020,806.4","24,020,806.4","128.2539","20.52","15.00","3.96","1.37","5.18","5.52","16.56","Yes","Yes" +"0xaf35cde2e2e1e68356f48c013613a3955d5dc6b6","6","800,000","800,000","24,001,600","24,000,000","128.1514","20.50","15.00","3.96","1.37","5.18","5.50","16.54","Yes","Yes" +"0x365c46cfea1855c82f5544d76b5e5fbe2d628985","6","800,000","800,000","24,000,000","24,000,000","128.1428","20.50","15.00","3.96","1.37","5.18","5.50","16.54","Yes","Yes" +"0x379949eb8ee41b121e2b54f990154ac31126c9fe","6","800,000","800,000","23,617,453.74","23,617,453.74","126.1003","20.18","15.00","3.96","1.35","5.09","5.18","16.22","Yes","Yes" +"0x294b3782aef0848f8bb233172cc46eff8b1d3c49","6","800,000","800,000","23,200,000","0","123.8714","19.82","15.00","3.96","1.32","5.00","4.82","15.86","Yes","Yes" +"0xa176c9630f02a71f9fcffe88922ec0d52b428d7d","6","800,000","800,000","22,400,000","0","119.6000","19.14","15.00","3.96","1.28","4.83","4.14","15.18","Yes","Yes" +"0xa70d11752e0b6c2ad026cf60c4114d8c6909df6b","6","800,000","704,432","21,132,960","21,132,960","112.8349","18.05","15.00","3.96","1.20","4.56","3.05","14.09","Yes","Yes" +"0x980ece433b54caa56251d050cb90e706871cec8d","6","800,000","556,318","16,860,848.26","16,829,414.7","90.0249","14.40","15.00","3.96","0.96","3.64","-0.60","10.44","No","Yes" +"0x41845e0384535423b6a3d64c79cf5721bdb87a1f","6","800,000","550,800","16,524,000","0","88.2263","14.12","15.00","3.96","0.94","3.56","-0.88","10.16","No","Yes" +"0x386344dece8caddaa272dc29a866fc7729f4ad8e","6","800,000","520,400","15,612,000","0","83.3569","13.34","15.00","3.96","0.89","3.37","-1.66","9.38","No","Yes" +"0x2a6d8c30e25af6d6f0c5dcc1455352c0c8cfaf31","6","800,000","512,309.93","15,369,297.84","15,369,297.84","82.0611","13.13","15.00","3.96","0.88","3.32","-1.87","9.17","No","Yes" +"0x72aa6125c2a93d0c5bbadd524718f5e4d13cd1c5","6","800,000","795,500","12,728,000","0","67.9584","10.87","15.00","3.96","0.72","2.75","-4.13","6.91","No","Yes" +"0xfdd498c312cb5aac919e830d6315290d2be190c7","5","350,000","350,000","10,747,086.16","10,726,333.5","57.3817","9.18","8.00","2.11","1.15","4.35","1.18","7.07","Yes","Yes" +"0xa3fb39949dfe8040f42378cf66dc7f90719150d9","5","350,000","350,000","10,682,557.9","10,661,934.03","57.0372","9.13","8.00","2.11","1.14","4.32","1.13","7.01","Yes","Yes" +"0xff61a30a954367758552d5fd9ce7a28369898496","5","350,000","349,000","10,513,400.44","10,499,381.68","56.1340","8.98","8.00","2.11","1.12","4.25","0.98","6.87","Yes","Yes" +"0x76da553883cd6f24fb6b3cda16d273b93a65ada8","5","350,000","350,000","10,500,000","10,500,000","56.0625","8.97","8.00","2.11","1.12","4.25","0.97","6.86","Yes","Yes" +"0x445715d1f5a737d71de630d73e3ae3fc303712bf","5","350,000","350,000","10,500,000","0","56.0625","8.97","8.00","2.11","1.12","4.25","0.97","6.86","Yes","Yes" +"0x041c60e0962f8d8791aa683cd450aec42d5ffca0","5","350,000","350,000","10,500,000","0","56.0625","8.97","8.00","2.11","1.12","4.25","0.97","6.86","Yes","Yes" +"0x8065bed17ac2686ef9c5b706bf39188e4ed19719","5","350,000","350,000","10,150,000","0","54.1937","8.67","8.00","2.11","1.08","4.11","0.67","6.56","Yes","Yes" +"0xad1be47f4f502b165af5c88cec7c5f52953aa005","5","350,000","278,500","8,415,990.13","8,401,971.18","44.9354","7.19","8.00","2.11","0.90","3.40","-0.81","5.08","No","Yes" +"0xff8c87595495750f407bb94dd35ef7db034fdb59","5","350,000","290,904.79","8,091,951.24","7,366,017.07","43.2052","6.91","8.00","2.11","0.86","3.27","-1.09","4.80","No","Yes" +"0x5c263db138be88737ad66c01428ff847861ad8f1","5","350,000","264,546.55","8,081,337.59","8,065,735.22","43.1486","6.90","8.00","2.11","0.86","3.27","-1.10","4.79","No","Yes" +"0x818cdfedc8578fef02dc0d0aeec1448a450ea467","5","350,000","252,832.14","7,584,964.26","0","40.4983","6.48","8.00","2.11","0.81","3.07","-1.52","4.37","No","Yes" +"0x19bc5de9f3f1e438bdfeea5d8cc808f1144aa194","5","350,000","251,724","7,551,720","7,551,720","40.3208","6.45","8.00","2.11","0.81","3.05","-1.55","4.34","No","Yes" +"0x1c176951b49963bbd7b5bd8a0dcdfefbe8ce0977","5","350,000","242,028.1","7,406,419.5","7,392,119.31","39.5450","6.33","8.00","2.11","0.79","3.00","-1.67","4.21","No","Yes" +"0x2d41e869993b91270fae00823622f2f9c7925ab5","5","350,000","348,553.25","6,971,064.99","0","37.2205","5.96","8.00","2.11","0.74","2.82","-2.04","3.84","No","Yes" +"0x2dba82021c355a0239e951c8c93dcf1e9b82246f","5","350,000","289,541.88","5,611,031.77","5,600,987.96","29.9589","4.79","8.00","2.11","0.60","2.27","-3.21","2.68","No","Yes" +"0x2795f97541e6b9af8213a5b491e6f20f23b8ed0b","4","150,000","150,000","4,502,102.4","4,500,900.6","24.0380","3.85","4.00","1.06","0.96","3.64","-0.15","2.79","No","Yes" +"0xd8c0d5523824994d43743f94dab72f16b306b248","4","150,000","150,000","4,500,000","0","24.0268","3.84","4.00","1.06","0.96","3.64","-0.16","2.79","No","Yes" +"0xccf81389129f506d2a278e1ace0b6fa942a6b4a4","4","150,000","150,000","4,500,000","4,500,000","24.0268","3.84","4.00","1.06","0.96","3.64","-0.16","2.79","No","Yes" +"0xc28e635715b808494187941bbb26248e1ce8e1b2","4","150,000","150,000","4,500,000","0","24.0268","3.84","4.00","1.06","0.96","3.64","-0.16","2.79","No","Yes" +"0x556e1e264994b18e166d2d8c4912d9189eb168b5","4","150,000","150,000","4,500,000","0","24.0268","3.84","4.00","1.06","0.96","3.64","-0.16","2.79","No","Yes" +"0x45de9a46375408d9acfe241e29c59ca2b1d19a22","4","150,000","150,000","4,500,000","0","24.0268","3.84","4.00","1.06","0.96","3.64","-0.16","2.79","No","Yes" +"0x126ec9c6dc8ce7f834f2302cfcf57d526add8013","4","150,000","150,000","4,500,000","4,500,000","24.0268","3.84","4.00","1.06","0.96","3.64","-0.16","2.79","No","Yes" +"0x8c9524d7756c3f87ac3a174fc93f193260a3729a","4","150,000","143,351.9","4,162,652.55","4,157,205.18","22.2256","3.56","4.00","1.06","0.89","3.37","-0.44","2.50","No","Yes" +"0x5ad4f60eead27b5036aaebfa17016aef4e79d920","4","150,000","150,000","4,050,000","0","21.6241","3.46","4.00","1.06","0.86","3.28","-0.54","2.40","No","Yes" +"0x32e6557a77724385732df7112eb7693115171d3e","4","150,000","150,000","3,900,000","0","20.8232","3.33","4.00","1.06","0.83","3.15","-0.67","2.28","No","Yes" +"0x97f46368175b980b7124e38f0af4daac008a058f","4","150,000","129,727.05","3,762,084.4","0","20.0868","3.21","4.00","1.06","0.80","3.04","-0.79","2.16","No","Yes" +"0xe1eaf4834316cc6d6c90cea7dfae52224664690c","4","150,000","150,000","3,604,500","3,600,000","19.2455","3.08","4.00","1.06","0.77","2.92","-0.92","2.02","No","Yes" +"0x34d3e737cc228aaebea03ec8e98426ee3748b30a","5","350,000","270,322.26","3,514,189.43","0","18.7633","3.00","8.00","2.11","0.38","1.42","-5.00","0.89","No","Yes" +"0x804acfdffdf8d09af6abf7b4c48ccc690a36fd29","4","150,000","140,502.36","3,372,056.63","0","18.0044","2.88","4.00","1.06","0.72","2.73","-1.12","1.82","No","Yes" +"0x1635ce4325eb96817610255fed3b39273deea95e","5","350,000","300,000.01","3,300,000.1","0","17.6196","2.82","8.00","2.11","0.35","1.33","-5.18","0.71","No","Yes" +"0xb84180c2d8ef3d07d2bf8e0a20960bd12a879c88","4","150,000","109,735","3,182,315","0","16.9913","2.72","4.00","1.06","0.68","2.57","-1.28","1.66","No","Yes" +"0xc16f48ce7c684c9f9801c536a9adaec82d22ffec","4","150,000","117,102.28","2,959,835.92","2,954,161.8","15.8034","2.53","4.00","1.06","0.63","2.39","-1.47","1.47","No","Yes" +"0xaa3c5ab4627d5114e1565d4b483a93c9b8925628","4","150,000","96,170.41","2,885,112.39","0","15.4044","2.46","4.00","1.06","0.62","2.33","-1.54","1.41","No","Yes" +"0x3dad445ebde7815fede16604f2d1e98dfa7c78f1","4","150,000","99,250.18","2,878,255.28","0","15.3678","2.46","4.00","1.06","0.61","2.33","-1.54","1.40","No","Yes" +"0x2ab9f95d1e1cf102785ea9b71c97ea9ae50ed763","4","150,000","91,000","2,736,122.33","2,732,548","14.6089","2.34","4.00","1.06","0.58","2.21","-1.66","1.28","No","Yes" +"0x83771c019a51462a3407c54345a02dc8c6a85108","4","150,000","119,911.84","2,638,060.55","0","14.0854","2.25","4.00","1.06","0.56","2.13","-1.75","1.20","No","Yes" +"0x632a8281c898ae05c33305fd5c1deccc21e2e10b","4","150,000","150,000","2,550,000","0","13.6152","2.18","4.00","1.06","0.54","2.06","-1.82","1.12","No","Yes" +"0x484464bf49f57b1a0d45621a631c8d2ee17035eb","3","60,000","60,000","1,839,326.05","1,836,014.03","9.8207","1.57","2.00","0.53","0.79","2.98","-0.43","1.04","No","Yes" +"0x0bf5f13833cb7d1c6c1399ea6c4ec8aaab4b5639","3","60,000","60,000","1,831,917.09","1,828,500.09","9.7811","1.56","2.00","0.53","0.78","2.96","-0.44","1.04","No","Yes" +"0xea11381ada3590103d756f01e1c492ffe94d9f2f","3","60,000","60,000","1,800,000","1,800,000","9.6107","1.54","2.00","0.53","0.77","2.91","-0.46","1.01","No","Yes" +"0xaa1b8e331c0177a0ec38827ea5ba015a41c3e341","3","60,000","60,000","1,800,000","0","9.6107","1.54","2.00","0.53","0.77","2.91","-0.46","1.01","No","Yes" +"0x9b29082e51e24dc8b91497cba7e5ac597b9aa7f6","3","60,000","60,000","1,800,000","0","9.6107","1.54","2.00","0.53","0.77","2.91","-0.46","1.01","No","Yes" +"0x3ae67635546101605e6e48ad74bf09c7fb4b0e78","7","1,800,000","1,800,000","1,800,000","1,800,000","9.6107","1.54","30.00","7.92","0.05","0.19","-28.46","-6.38","No","No" +"0xca54fa35a5b545c1564f9373255e29d30192f6e7","3","60,000","59,497.33","1,794,849.39","1,792,929.45","9.5832","1.53","2.00","0.53","0.77","2.90","-0.47","1.01","No","Yes" +"0xc8f8a1e764afaf012d296a60b32e0e17e1693a85","3","60,000","60,000","1,740,000","0","9.2904","1.49","2.00","0.53","0.74","2.81","-0.51","0.96","No","Yes" +"0x86a69e4fa797262e9cb539155adf1ae6681a9766","3","60,000","60,000","1,740,000","0","9.2904","1.49","2.00","0.53","0.74","2.81","-0.51","0.96","No","Yes" +"0x397fcacc9b35d464ed4ec2330d6b5172b61a5822","3","60,000","60,000","1,740,000","0","9.2904","1.49","2.00","0.53","0.74","2.81","-0.51","0.96","No","Yes" +"0x105156087fc2f383f5002465f0fdeb94da6c8a80","3","60,000","60,000","1,740,000","0","9.2904","1.49","2.00","0.53","0.74","2.81","-0.51","0.96","No","Yes" +"0xbe617e01a5cc450360a7dc27fe410557dab04769","3","60,000","60,000","1,620,360","1,620,000","8.6516","1.38","2.00","0.53","0.69","2.62","-0.62","0.86","No","Yes" +"0xb6ad6c7021bf0b3f250fb52e4b68f01cd31464e8","3","60,000","60,000","1,620,000","1,620,000","8.6496","1.38","2.00","0.53","0.69","2.62","-0.62","0.86","No","Yes" +"0xa2bff46104c5db0fceee9d11db0e5bf671d4f3bb","3","60,000","59,480","1,605,960","0","8.5747","1.37","2.00","0.53","0.69","2.60","-0.63","0.84","No","Yes" +"0x9bb72715c2a9edc1c453c076316fef90c9d462fd","3","60,000","60,000","1,528,901.87","1,526,448.98","8.1632","1.31","2.00","0.53","0.65","2.47","-0.69","0.78","No","Yes" +"0xb6f66338a50c9d8ab4e8cd516ad8aacce8b5028d","3","60,000","60,000","1,500,000","0","8.0089","1.28","2.00","0.53","0.64","2.43","-0.72","0.75","No","Yes" +"0x879ba6320c909ef3487ba6f5de7361299be78c9f","3","60,000","59,530.79","1,490,769.96","1,488,269.66","7.9596","1.27","2.00","0.53","0.64","2.41","-0.73","0.75","No","Yes" +"0x0a5dbaf976c91b12e448071316d89b215e318d70","3","60,000","52,512.05","1,480,673.19","1,477,822.56","7.9057","1.26","2.00","0.53","0.63","2.40","-0.74","0.74","No","Yes" +"0x90921efeb37a66ee59621fc196087cbf2c27618f","3","60,000","60,000","1,440,000","0","7.6886","1.23","2.00","0.53","0.62","2.33","-0.77","0.70","No","Yes" +"0xe614f620e1ad131d9ef45343548c064faeff25af","3","60,000","52,418.13","1,415,708.97","1,415,289.63","7.5589","1.21","2.00","0.53","0.60","2.29","-0.79","0.68","No","Yes" +"0xe505ca94809baf9340fe0af280ec7143d37b9ae4","3","60,000","44,535.49","1,301,932.72","1,299,511.83","6.9514","1.11","2.00","0.53","0.56","2.11","-0.89","0.58","No","Yes" +"0xab5a2d367a3ef6888caabe20c4b701badd87e58b","3","60,000","60,000","1,277,674.54","1,275,363.81","6.8219","1.09","2.00","0.53","0.55","2.07","-0.91","0.56","No","Yes" +"0x8b94627cf07aaedd57a6dea21fecf3ea533f29f1","3","60,000","36,105.12","1,105,496.84","1,102,510.91","5.9026","0.94","2.00","0.53","0.47","1.79","-1.06","0.42","No","Yes" +"0x67d6f5ad8e142f9b4907b19f680b8503c6893303","3","60,000","36,564.17","988,475.89","987,232.71","5.2778","0.84","2.00","0.53","0.42","1.60","-1.16","0.32","No","Yes" +"0x5224bfae51b4320b1207f7b059b10946ff4e9314","3","60,000","60,000","900,480","900,000","4.8079","0.77","2.00","0.53","0.38","1.46","-1.23","0.24","No","Yes" +"0x00c0118a4c8ceecc2453f2cae0e31ef35e752754","2","25,000","24,656.26","739,687.89","739,687.89","3.9494","0.63","1.00","0.26","0.63","2.39","-0.37","0.37","No","Yes" +"0xbfc246fc6cc9f0e7860c208bb6ea7c1c9003294d","2","25,000","24,184.51","738,502.65","737,173.41","3.9431","0.63","1.00","0.26","0.63","2.39","-0.37","0.37","No","Yes" +"0xb7f563b9660e4b0aa3729ba1e87d3cff0382816d","2","25,000","25,000","735,591.54","734,173.19","3.9275","0.63","1.00","0.26","0.63","2.38","-0.37","0.36","No","Yes" +"0xb847f453ec067377214f90a20826afddf0319eb2","2","25,000","24,173","701,017","0","3.7429","0.60","1.00","0.26","0.60","2.27","-0.40","0.33","No","Yes" +"0xaa5fbd4ffa50f8df3afea0ff936ee62485725554","2","25,000","25,000","700,000","0","3.7375","0.60","1.00","0.26","0.60","2.26","-0.40","0.33","No","Yes" +"0x063c2cb6aa70fcb1410f2f455f153d0664e92369","2","25,000","17,914.24","501,598.79","0","2.6782","0.43","1.00","0.26","0.43","1.62","-0.57","0.16","No","Yes" +"0x5cc65e0f2ed2997d4ff074942e4f56c20a519a1d","2","25,000","25,000","475,000","0","2.5362","0.41","1.00","0.26","0.41","1.54","-0.59","0.14","No","Yes" +"0xe3ee5c72b08c89eb79d9a3f144e3bbc63c388986","2","25,000","13,734.36","412,030.91","412,030.91","2.2000","0.35","1.00","0.26","0.35","1.33","-0.65","0.09","No","Yes" +"0xc0af8fc8d99452639201eda3adc3c997e7c6e7b7","2","25,000","18,766.78","399,470.78","398,785.81","2.1329","0.34","1.00","0.26","0.34","1.29","-0.66","0.08","No","Yes" +"0x1dad04c41f82b2cd932c2edf79e28d81bc57bc39","1","10,000","10,000","304,824.36","304,255.85","1.6275","0.26","0.50","0.13","0.52","1.97","-0.24","0.13","No","Yes" +"0x9a862c5cb00cd7bcf9e8f6b9b8506d117afaacab","2","25,000","11,674.72","303,542.67","0","1.6207","0.26","1.00","0.26","0.26","0.98","-0.74","-0.00","No","No" +"0xcdb40cfb1dff93b0904b46fe4db42d892205e1ae","1","10,000","10,000","300,480","300,000","1.6043","0.26","0.50","0.13","0.51","1.94","-0.24","0.12","No","Yes" +"0xb8423034aa5f0f4359228776275ba9e384c18a0c","1","10,000","10,000","300,000","300,000","1.6018","0.26","0.50","0.13","0.51","1.94","-0.24","0.12","No","Yes" +"0x335977b2165dabe24fa0acc284adee6bc2760e8f","1","10,000","10,000","300,000","0","1.6018","0.26","0.50","0.13","0.51","1.94","-0.24","0.12","No","Yes" +"0x160cf6551ee3d910f673af762d5a2f1bd4855be1","1","10,000","9,996.2","299,886.02","299,886.02","1.6012","0.26","0.50","0.13","0.51","1.94","-0.24","0.12","No","Yes" +"0x27a90a6825132eb88e8feaafe035658663c8944f","3","60,000","32,648.77","261,190.17","0","1.3946","0.22","2.00","0.53","0.11","0.42","-1.78","-0.30","No","No" +"0x084c058bad49a6382090cc5fdab4ab6f64c97349","1","10,000","10,000","240,000","120,000","1.2814","0.21","0.50","0.13","0.41","1.55","-0.29","0.07","No","Yes" +"0x043ed3a18e640e5cc6ec571db07fa7a440234d74","1","10,000","9,341","214,843","0","1.1471","0.18","0.50","0.13","0.37","1.39","-0.32","0.05","No","Yes" +"0xdbce6ced778e6ced746e7ede2bc1babe4de993d0","1","10,000","9,762.16","184,118.19","159,586.3","0.9831","0.16","0.50","0.13","0.31","1.19","-0.34","0.03","No","Yes" +"0xd8427794f8e9af9bc0e027eb9d4d3ee63b2491b3","0","5,000","5,000","150,350.24","150,120","0.8028","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x743fe0b59467e55224220ab61b69da821d09bd6e","0","5,000","5,000","150,200","150,000","0.8020","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xad65bba08c7fa4fd7590c052624dbd91c76fb2fe","0","5,000","5,000","150,070","150,000","0.8013","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xf613419a0729d256ebedf4c0f6a4601b164c4f30","0","5,000","5,000","150,000","0","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xf5b66164ea2b41cd831fd90a34a53a2c19f1ed8f","0","5,000","5,000","150,000","0","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xdc23d96c2288d2e8ec71a098469c63a688b1b916","0","5,000","5,000","150,000","0","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xce833bb28d15455af31af5a30c4626bf2939e389","0","5,000","5,000","150,000","150,000","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xb72ad48aa021c977c9b6473002d2e07701629e66","0","5,000","5,000","150,000","150,000","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xb264e63d5c3dc94a1fde625acff2d8b2ba684b8a","0","5,000","5,000","150,000","0","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x9de1925269f2c68a2a570647ecb170fc245db448","0","5,000","5,000","150,000","0","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x8814391f0ecd57dc32166e42abfcbfb92db4b04a","0","5,000","5,000","150,000","0","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x77f62b2dd47520f0e29663c8f208a40682202936","0","5,000","5,000","150,000","150,000","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x69ee2db83fe529e1f3b684ace265dc9e8f3cda89","0","5,000","5,000","150,000","0","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x28d1c97a2c7e3e0698a06a814a4a9e1047cfc253","0","5,000","5,000","150,000","0","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x0dcaa84602bdc605eaf5667f784266d20a7f91f2","0","5,000","5,000","150,000","0","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x0bb4b0bf8d1dd7621f493f1a68ad0887d4e5b478","0","5,000","5,000","150,000","0","0.8009","0.13","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x6bbe2a84895ca675b2bf8d3633e25118c12ef912","0","5,000","5,000","145,110","145,000","0.7748","0.12","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xb555009df0dd3ba8e5c9ae74018dc16f3a14ecf3","0","5,000","5,000","145,000","0","0.7742","0.12","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x9c4b88fbe06b6b1e461d9d294ecb7fb0c841db4f","0","5,000","5,000","145,000","0","0.7742","0.12","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x93fe43db40c997ae784143f060032db16293d93f","0","5,000","5,000","145,000","0","0.7742","0.12","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x6713ea196a67ddf7e698e0cbe9225b3649cd7431","0","5,000","5,000","145,000","0","0.7742","0.12","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xa61b22be6d93b2ddc184861a0d780acf7d4abaa3","0","5,000","5,000","135,000","243,001.78","0.7208","0.12","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x1e050ca02787ab13d2006c9f06801789546a9eda","0","5,000","5,000","135,000","0","0.7208","0.12","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x68cb5757bcde51b25b936abcd4c4b02a6cfc2b2a","0","5,000","4,902","132,354","0","0.7067","0.11","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x3a50759e226d96f01d11e866e783553367f7ae66","0","5,000","5,000","130,000","0","0.6941","0.11","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x3208ca0f0d105082e0d7ba0d5a6158b0b190e08d","0","5,000","5,000","130,000","0","0.6941","0.11","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xd00ca4dea8adac3925e7695efd7015aafea898c8","0","5,000","4,392","128,915.51","128,675.72","0.6883","0.11","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xe470c6e98382b5e1337c424e2f29eb44194c18dc","0","5,000","5,000","125,000","0","0.6674","0.11","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xb06ee8f2b79d179ae004c2437614d56defba6eb8","0","5,000","5,000","125,000","0","0.6674","0.11","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x190a184701a3ab4d50375f3f443a205a4e147949","0","5,000","5,000","125,000","0","0.6674","0.11","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x1b444446ec828a5cdc8f4c2ab92a9a0df2095fae","0","5,000","5,000","120,020","120,000","0.6408","0.10","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xe832d1f23bcc355cfadc5950c3edcc210d91fa45","0","5,000","3,777.58","113,327.45","0","0.6051","0.10","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xff22a35a25865cc60f22adbf79acb3f42adee6b1","0","5,000","3,750.15","112,631.9","112,504.39","0.6014","0.10","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x0ff6a7857a3f91c75f4cf2f33c4eb0ba0f27640c","0","5,000","4,000.07","108,001.78","243,001.78","0.5767","0.09","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x8932afc812520dacfdcca38f037b6e80958f9e9a","0","5,000","5,000","105,000","0","0.5606","0.09","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x877e7fdaa8d76d20c41762d063c3b7947dac76bd","0","5,000","4,047.63","101,190.77","0","0.5403","0.09","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x6d2c1e7a5325e1cffa2c2c52136f3ca206d5669e","0","5,000","5,000","100,000","0","0.5339","0.09","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xc0805e89313fe3251072016bb8d1c02a38aa5632","0","5,000","5,000","95,000","0","0.5072","0.08","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x40f91043ea8bc25c5d35123d11203b8be9dc65bf","0","5,000","5,000","90,010","90,000","0.4806","0.08","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x300f00437198cbe0f841c7db55a1fe970b6a5319","0","5,000","5,000","90,000","0","0.4805","0.08","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x659ebb7a0813ad2107592b3ec67be500e2792992","0","5,000","3,080.64","86,258.05","0","0.4606","0.07","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xeceb3bc3d347dd3a41a0c90223e9fe3952674d28","0","5,000","2,873.48","86,204.28","86,204.28","0.4603","0.07","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x8c9e5391866e6e05d2d884e7970f0f0793277880","0","5,000","2,999","83,972","0","0.4484","0.07","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x2fd934f9920c9d2fab006e4ea9cb8357aefde3f0","0","5,000","3,065","80,411.05","80,256.67","0.4293","0.07","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xf6878bc768d664afdf815898d1f908be54eedc52","0","5,000","5,000","80,000","0","0.4271","0.07","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xcc57971374fcdf76a73341a54996c4a6f8dde1c9","0","5,000","5,000","80,000","0","0.4271","0.07","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x08da821717d3a2436fbb56e1de9c421c001a9648","0","5,000","5,000","80,000","0","0.4271","0.07","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x03dae2b6ec973a97db36486c51914ddc8efe9048","0","5,000","5,000","80,000","0","0.4271","0.07","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x1b1e4349d2af614904ee0ffafe19f95a45cdeb35","0","5,000","5,000","75,000","0","0.4004","0.06","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x3bc28cc96c8ae2eec361bc5e01c01e75f2c7b3d5","0","5,000","2,670.05","73,491.82","0","0.3924","0.06","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xb4b107638cf0df8afb87e34ca31adfcb9f399e3d","0","5,000","2,432.91","72,987.16","72,987.16","0.3897","0.06","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x1f1cfe5e8afd4106632548a9e67401ac28572e05","0","5,000","2,394.75","71,842.4","0","0.3836","0.06","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xf0d7dffe65576d4328bd9eea58869d0387b0c005","0","5,000","1,963.12","58,893.66","0","0.3144","0.05","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x2a95913741cc5a3e812d9ec0c861d86e568ec284","0","5,000","1,885.3","52,788.4","0","0.2819","0.05","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x85b5a8344a1724cd534328e4006bfd517daeb503","0","5,000","5,000","45,000","45,000","0.2403","0.04","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x7fbfba8204c9c15d66fe1429a072752081a23ed7","0","5,000","5,000","45,000","45,000","0.2403","0.04","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xc67fbb1fd4dc8bccb340fde1737230e6d84a974d","0","5,000","5,000","30,060","110,060","0.1605","0.03","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x71e15cbb415ead455c86e5a11b07e5ec54512fb6","0","5,000","953.77","28,612.99","28,612.99","0.1528","0.02","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x43ae7aa991b61d4b6ae9b175f00c3c0abbb08f45","0","5,000","1,427","28,540","0","0.1524","0.02","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x0bd5d4c398f7a58741f3befceec6b84730ec3b3e","0","5,000","5,000","25,020","25,000","0.1336","0.02","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xfc030e7d6edf79f19e722dee7fe83e9ffac9ce54","0","5,000","740.46","22,652.04","22,612.74","0.1209","0.02","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xfcc46b36098f6d2490097b0c6f0ac5c97b212d5e","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xf78dad600e80716805bab5db735d9ff3ca966733","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xf661459c9dc544a674104b3322957fb198907e0d","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xf338cc8098cb0f0b0b35ffc8aeeaf86fdecedbb7","0","5,000","0","0","216,005,077.82","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xede1b3fa24cd09be8263d8c6ab145234457b0982","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xedcba6be63ef49ea9422eaa82a94949e06754252","0","5,000","0","0","24,020,806.4","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xebd2ad98fcc53ee0c4e72adb4ea336a42fc250de","0","5,000","0","0","110,060","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xebbdc7ea2019adc3fe4326d88c597c0f093ce784","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xe88c3ff1db5aa8b329e40a3f28257ba5eb69007d","0","5,000","0","0","1,299,511.83","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xe81e09df966dd3a62e7bdf5a0e4b5bdb5603af35","0","5,000","0","0","8,065,735.22","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xe53543563ff3df5b8399ef4d6eccf2b10b35ef82","0","5,000","0","0","24,020,806.4","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xe3e863c282e3f1593796587301f14298e839466a","0","5,000","0","0","25,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xe08e95f51e5f8eeaeb1ee6065ae2c16884943e12","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xe05e8c7e51478553878c2d7332de50e9e4f7286f","0","5,000","0","0","1,800,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xda4f874ece4f3910a4fdccde7fb649bea50c6291","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xd65cdb4051ad040e31ab2d4dbac6265f0fc2ee9b","0","5,000","0","0","23,617,453.74","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xd62d21d619b082b47bcb875603f06f121f00c941","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xca3be6c4b9336038dc01bf317c1288fc13edbdaa","0","5,000","0","0","8,065,735.22","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xc213ae792bc642cb8526aad91c7586e086b84eb5","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xbe5d979c964e5d7d6f9786ceb697216953a7ffe8","0","5,000","0","0","8,065,735.22","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xbe2aa3a87356f431de0a26f52dbd25b513bdd763","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xbcf507bf620c3bd65874feaa4400cd924e432a14","0","5,000","0","0","739,687.89","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xb7faca3585241e899f3c96668bee199617b39332","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xb4a280b84381c864b5c60bfbfd426fc53852be96","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xb0933e8b1d0559149b5edd8cb58e6e7bdbf6a15d","0","5,000","0","0","150,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xaf06b9c4cd3ff54de97bbeaf336fed0c47796c2c","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xaed7ec9b3e4e5f21ec5b44c7c1edb15f7be9bbea","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xacbf3bb1efd82640c43f93df145aa64f2b86f667","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xabdb06ac1bbd963097df3630b042a9a067feb976","0","5,000","0","0","211,462,432.6","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xaaf907387e561fbe0e36cce58ed602b2abc5b8cf","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0xaabcfd19a71ea44c639a988ad3357e4f4e5fc779","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x984becaf762a006552706f5cf0f58cce09675b70","0","5,000","0","0","135,117,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x94c740f171592fcc0b152d90a177bec88e541974","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x9418d21ce57ea6f2afb8429e640ce79830a04948","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x91c0762fe463fc72b0464e0b859ef639e801991a","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x904e60863ed6e4fc2fb4e26d9f3fe4079381d689","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x8c39df93724f9057f083434e8b954370c7a830ed","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x8a79dc25fbaf8643c22d961448fd76833b5e81a4","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x8a65e11fe169386718e1979043fc3a5126c8949a","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x86bb239d7f94cadf707f9ac52e932aa42371111b","0","5,000","0","0","1,620,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x864ea716df37cb55823681d04cf3332a851d54e0","0","5,000","0","0","24,020,806.4","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x86246bdca1750f0b2bbfe8b24da1ecb40d87fc66","0","5,000","0","0","211,462,432.6","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x83f3df36610f3a07304d246d197c5036ec11239b","0","5,000","0","0","299,886.02","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x80f7e693fc2920998b10571b420d8b9845b0afe4","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x7942fe304321342371c1d9b7da3ede4f292ca658","0","5,000","0","0","50,400,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x776819a6a003b208093ca944b34221ae59237d57","0","5,000","0","0","1,800,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x75a81fb04136ae22cc1dea7ef010d6e94dafcdf7","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x73bbdd988d9efa1043747b799e5119f0f79679e0","0","5,000","0","0","211,462,432.6","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x6e8c3d389b30c522669548dd5c60aa26436442ac","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x6a296ef4c5e716fd2bcaaff9041cc3e2ca54efec","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x6a26fe32cbc9c782fcfd33b5a5998d0631927a1d","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x695a078d7015986a14e0b29959b3c0777aea7a6d","0","5,000","0","0","8,065,735.22","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x68d27176a5a747b91854cb7e32313f958a814a4d","0","5,000","0","0","10,661,934.03","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x64284e30d519df74104341231728eeff17be2144","0","5,000","0","0","1,620,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x61f0420c8e792b28c61eb67dccad2defa5ba11a3","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x5e57624bf4f9041445911e8f5497b4eabad02a24","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x5e32d78031752af2b9b2ae6bebd4aa5ec1d2156a","0","5,000","0","0","8,065,735.22","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x5d79bf0111f178b7ca050ded0608e6693a45e8c5","0","5,000","0","0","1,800,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x58da399155cb7b41da4a2df9315c776790fee951","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x57db0ea93e1007de9758f05b99fa8f02f62b3230","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x57c0d8652b1055791563ba3ea341a31524bd84c3","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x56054523262f089b0ec202adfe63fee5a9bac5b8","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x4fe70543947325393966e9f69847db40debbc4ec","0","5,000","0","0","150,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x4b3b72e6cb646711a5744e8383a619114ec44f90","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x4987b10eea5e453a9e9daec805f42f60ad38b0ce","0","5,000","0","0","23,617,453.74","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x48f8dc61316a7569bdce0d14a94884a27cd803e4","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x46973d7f1d38938211c296ff818070ff8c1b57a6","0","5,000","0","0","2,954,161.8","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x45b09f568a5333283ccabda649bd9a0ee53050a4","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x4404f908e7ae121fca7a9ea9db6902d5e8624f07","0","5,000","0","0","234,606,938.3","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x44021db3162e5baac4637ae1520077473e25bd92","0","5,000","0","0","24,020,806.4","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x429c712d9aa50a93a07377e3aef081e9ef343312","0","5,000","0","0","7,392,119.31","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x4233b033fc4348d14e9e81cd3d8f95ac51b0fcef","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x4095266532479952aaf9f31b247a44e6ed65ac26","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x3d1dedd0c9e64c82192f5eb4a17d03ac31738d88","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x3d0145bdc675fe89a1bc50ecb55c6be237568b70","0","5,000","0","0","8,065,735.22","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x34182508cb615a917f2ae185147b8125fbf54220","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x26d1b321729b6c021823e130d005f0f3bc9174ef","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x259f381b0d3e0cc60f9a83a8b6e973df36d80879","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x1f4d5640f1b571a1136b48422ede81d00e5455c8","0","5,000","0","0","150,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x1e2c2fd904276d2d56f485f47bcbe37898afafd0","0","5,000","0","0","24,655,918.85","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x1dbf4ce8fc3874aa6143dcbe0ef6a0fc23e5a44f","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x1bf2402db06b87513fa69cfd6ff16d970db4a62e","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x1bc719bca17f90944d420a7de9c85d2ca13d69d3","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x19dead03929743c097016fb3d2c24924d842e6ed","0","5,000","0","0","21,132,960","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x17650afea949f40f9abe05470e17d2d003377b37","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x163f6e3592fde1798c386692a918d87181ec0f7a","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x106299331ab5f33a1d862b7b2be7f3f824dcbccd","0","5,000","0","0","8,065,735.22","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x0efc56448f39d84fd85e631dcc40fedac152c2d3","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x0d1972fd5de4178b73571cd56c480ed4b7890020","0","5,000","0","0","0","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x0b3f35d92fcf68e560e43dfce5b5309b8f9291c4","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x0a386a16a851d476d1f6336d429f850f943a77c3","0","5,000","0","0","24,000,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x060f729a9d7471956d2516dc8cfed6589d4c6b32","0","5,000","0","0","1,620,000","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x0577f8438448a38db0e5b0abf49d1b8f3fd65c32","0","5,000","0","0","7,366,017.07","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" +"0x04ac91676d54c44f63270f872583a24660a5f566","0","5,000","0","0","159,586.3","0.0000","0.00","0.00","0.00","N/A","N/A","N/A","N/A","Free Tier","Free Tier" + +"SUMMARY STATISTICS" + +"Metric","Value" +"Season","30" +"VAPE Price at Season","$0.1600" +"Reference VAPE Price (Original Fee Design)","$0.6060" +"Price Multiplier","0.2640" + +"Total Users","267" +"Users with Paid Pass (Tier 1+)","112" +"Users on Free Tier (Tier 0)","155" + +"Total Original Fees Collected","$1305.00" +"Total Dynamic Fees (Proposed)","$344.55" +"Fee Reduction","73.6%" + +"Total VAPE Value Distributed","$2123.44" + +"PROFITABILITY ANALYSIS (Paid Pass Users Only)" +"Original Pricing - Profitable Users","33 / 112 (29.5%)" +"Dynamic Pricing - Profitable Users","109 / 112 (97.3%)" +"Improvement","+76 users (+67.9%)" + +"Average Original ROI","1.63x" +"Average Dynamic ROI","6.16x" + +"PRICING MODEL" +"Formula","Dynamic Fee = Original Fee × (Current VAPE Price / Reference VAPE Price)" +"Example (Tier 10)","$100 × ($0.16 / $0.606) = $26.40" + +"TIER FEE COMPARISON" +"Tier","Deposit Limit","Original Fee","Dynamic Fee","Reduction" +"0","5,000 VPND","$0.00","$0.00","N/A" +"1","10,000 VPND","$0.50","$0.13","74%" +"2","25,000 VPND","$1.00","$0.26","74%" +"3","60,000 VPND","$2.00","$0.53","74%" +"4","150,000 VPND","$4.00","$1.06","74%" +"5","350,000 VPND","$8.00","$2.11","74%" +"6","800,000 VPND","$15.00","$3.96","74%" +"7","1,800,000 VPND","$30.00","$7.92","74%" +"8","4,500,000 VPND","$50.00","$13.20","74%" +"9","12,000,000 VPND","$75.00","$19.80","74%" +"10","Unlimited VPND","$100.00","$26.40","74%" \ No newline at end of file diff --git a/scripts/simulation/analyzeUtilization.ts b/scripts/simulation/analyzeUtilization.ts new file mode 100644 index 0000000..9cdb2c1 --- /dev/null +++ b/scripts/simulation/analyzeUtilization.ts @@ -0,0 +1,69 @@ +import * as fs from 'fs' + +const csv = fs.readFileSync('scripts/simulation/VaporFi_LiquidMining_Season30_Analysis_2026-01-30.csv', 'utf-8') +const lines = csv.split('\n').slice(1) + +const tierLimits: Record = { + '5,000': 5000, + '10,000': 10000, + '25,000': 25000, + '60,000': 60000, + '150,000': 150000, + '350,000': 350000, + '800,000': 800000, + '1,800,000': 1800000, + '4,500,000': 4500000, + '12,000,000': 12000000, +} + +let notProfitableMaxed = 0 +let notProfitableNotMaxed = 0 +let profitableMaxed = 0 +let profitableNotMaxed = 0 + +console.log('USERS NOT PROFITABLE (Original Pricing):\n') +console.log('Wallet | Tier | Limit | Deposited | % of Limit | ROI') +console.log('-'.repeat(110)) + +for (const line of lines) { + if (!line.includes('0x')) continue + + const cols = line.match(/"([^"]*)"/g)?.map((c) => c.replace(/"/g, '')) || [] + if (cols.length < 16) continue + + const [wallet, tier, limitStr, depositedStr, , , , , , , origROI, , , , origProfitable] = cols + + if (tier === '0' || origProfitable === 'Free Tier') continue + + const limit = tierLimits[limitStr] || 0 + const deposited = parseFloat(depositedStr.replace(/,/g, '')) + const pctOfLimit = ((deposited / limit) * 100).toFixed(1) + const isMaxed = deposited >= limit * 0.95 + const isProfitable = origProfitable === 'Yes' + + if (!isProfitable) { + console.log( + `${wallet.padEnd(42)} | ${tier.padEnd(4)} | ${limitStr.padEnd(11)} | ${depositedStr.padEnd(15)} | ${pctOfLimit.padStart(6)}% | ${origROI}x` + ) + if (isMaxed) notProfitableMaxed++ + else notProfitableNotMaxed++ + } else { + if (isMaxed) profitableMaxed++ + else profitableNotMaxed++ + } +} + +console.log('\n' + '='.repeat(110)) +console.log('\nSUMMARY (Paid Pass Users Only):') +console.log('─'.repeat(50)) +console.log(`NOT Profitable + Maxed Deposit (≥95%): ${notProfitableMaxed}`) +console.log(`NOT Profitable + Under Deposit (<95%): ${notProfitableNotMaxed}`) +console.log(`Profitable + Maxed Deposit (≥95%): ${profitableMaxed}`) +console.log(`Profitable + Under Deposit (<95%): ${profitableNotMaxed}`) +console.log('─'.repeat(50)) +console.log(`\nTotal Not Profitable: ${notProfitableMaxed + notProfitableNotMaxed}`) +console.log(`Total Profitable: ${profitableMaxed + profitableNotMaxed}`) + +const totalNotProfit = notProfitableMaxed + notProfitableNotMaxed +const pctNotMaxed = ((notProfitableNotMaxed / totalNotProfit) * 100).toFixed(1) +console.log(`\n📊 Of ${totalNotProfit} unprofitable users, ${notProfitableNotMaxed} (${pctNotMaxed}%) did NOT max their tier limit`) diff --git a/scripts/simulation/exportSeasonAnalysis.ts b/scripts/simulation/exportSeasonAnalysis.ts new file mode 100644 index 0000000..d4b7cb5 --- /dev/null +++ b/scripts/simulation/exportSeasonAnalysis.ts @@ -0,0 +1,282 @@ +import { createPublicClient, http, formatUnits, parseUnits, type Address } from 'viem' +import { avalanche } from 'viem/chains' +import * as fs from 'fs' + +const LIQUID_MINING_DIAMOND = '0xAe950fdd0CC79DDE64d3Fffd40fabec3f7ba368B' as Address +const SUBGRAPH_URL = 'https://liquid-mining-indexer-production.up.railway.app/' + +const REFERENCE_VAPE_PRICE = 0.606 +const SEASON_ID = 30 +const VAPE_PRICE_AT_SEASON = 0.16 + +const TIER_DEPOSIT_LIMITS: Record = { + 0: parseUnits('5000', 18), + 1: parseUnits('10000', 18), + 2: parseUnits('25000', 18), + 3: parseUnits('60000', 18), + 4: parseUnits('150000', 18), + 5: parseUnits('350000', 18), + 6: parseUnits('800000', 18), + 7: parseUnits('1800000', 18), + 8: parseUnits('4500000', 18), + 9: parseUnits('12000000', 18), + 10: BigInt('115792089237316195423570985008687907853269984665640564039457584007913129639935'), +} + +const TIER_DEPOSIT_LIMITS_DISPLAY: Record = { + 0: '5,000', + 1: '10,000', + 2: '25,000', + 3: '60,000', + 4: '150,000', + 5: '350,000', + 6: '800,000', + 7: '1,800,000', + 8: '4,500,000', + 9: '12,000,000', + 10: 'Unlimited', +} + +const ORIGINAL_TIER_FEES_USDC: Record = { + 0: 0, + 1: 0.5, + 2: 1, + 3: 2, + 4: 4, + 5: 8, + 6: 15, + 7: 30, + 8: 50, + 9: 75, + 10: 100, +} + +interface SubgraphUser { + id: string + totalDeposited: string + walletPoints: string + totalClaimed: string + combinedPoints: string + seasonId: string +} + +async function fetchAllUsersForSeason(seasonId: number): Promise { + let allUsers: SubgraphUser[] = [] + let hasMore = true + let offset = 0 + const limit = 1000 + + while (hasMore) { + const query = ` + query Season { + users( + orderBy: "totalClaimed", + orderDirection: "desc", + where: {seasonId: "${seasonId}"}, + limit: ${limit}, + offset: ${offset} + ) { + items { + id + totalDeposited + walletPoints + totalClaimed + combinedPoints + seasonId + } + } + } + ` + + try { + const response = await fetch(SUBGRAPH_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ query }), + }) + const data = await response.json() + const users = data.data?.users?.items || [] + + if (users.length === 0) { + hasMore = false + } else { + allUsers = allUsers.concat(users) + offset += limit + if (users.length < limit) hasMore = false + } + } catch (e) { + console.log(`Failed to fetch users:`, e) + hasMore = false + } + } + + return allUsers +} + +function getTierFromDeposit(depositedVPND: bigint): number { + for (let tier = 0; tier <= 10; tier++) { + if (depositedVPND <= TIER_DEPOSIT_LIMITS[tier]) { + return tier + } + } + return 10 +} + +function calculateDynamicFee(tier: number, vapePrice: number): number { + const originalFee = ORIGINAL_TIER_FEES_USDC[tier] + const multiplier = vapePrice / REFERENCE_VAPE_PRICE + return Math.max(originalFee * multiplier, 0) +} + +async function main() { + console.log('📊 VaporFi Liquid Mining - Season 30 User Analysis') + console.log('═'.repeat(60)) + console.log(`\nFetching all users for Season ${SEASON_ID}...\n`) + + const users = await fetchAllUsersForSeason(SEASON_ID) + console.log(`Found ${users.length} total users\n`) + + const rows: string[][] = [] + + rows.push([ + 'Wallet Address', + 'Tier', + 'Tier Deposit Limit (VPND)', + 'Deposited VPND', + 'Wallet Points', + 'Combined Points', + 'VAPE Claimed', + 'VAPE Value (USD)', + 'Original Fee (USD)', + 'Dynamic Fee (USD)', + 'Original ROI (x)', + 'Dynamic ROI (x)', + 'Original Profit/Loss (USD)', + 'Dynamic Profit/Loss (USD)', + 'Original Profitable?', + 'Dynamic Profitable?', + ]) + + let totalOriginalFees = 0 + let totalDynamicFees = 0 + let totalVAPEValue = 0 + let usersWithPaidPass = 0 + let originalProfitable = 0 + let dynamicProfitable = 0 + + for (const user of users) { + const walletAddress = user.id.split('-')[0] + const depositedVPND = BigInt(user.totalDeposited || '0') + const walletPoints = BigInt(user.walletPoints || '0') + const combinedPoints = BigInt(user.combinedPoints || '0') + const claimedVAPE = Number(formatUnits(BigInt(user.totalClaimed || '0'), 18)) + + const tier = getTierFromDeposit(depositedVPND) + const originalFee = ORIGINAL_TIER_FEES_USDC[tier] + const dynamicFee = calculateDynamicFee(tier, VAPE_PRICE_AT_SEASON) + const vapeValueUSD = claimedVAPE * VAPE_PRICE_AT_SEASON + + const originalROI = originalFee > 0 ? vapeValueUSD / originalFee : 0 + const dynamicROI = dynamicFee > 0 ? vapeValueUSD / dynamicFee : 0 + + const originalProfitLoss = vapeValueUSD - originalFee + const dynamicProfitLoss = vapeValueUSD - dynamicFee + + const isOriginalProfitable = originalFee > 0 && originalROI >= 1 + const isDynamicProfitable = dynamicFee > 0 && dynamicROI >= 1 + + if (originalFee > 0) { + usersWithPaidPass++ + totalOriginalFees += originalFee + totalDynamicFees += dynamicFee + totalVAPEValue += vapeValueUSD + if (isOriginalProfitable) originalProfitable++ + if (isDynamicProfitable) dynamicProfitable++ + } + + rows.push([ + walletAddress, + tier.toString(), + TIER_DEPOSIT_LIMITS_DISPLAY[tier], + Number(formatUnits(depositedVPND, 18)).toLocaleString('en-US', { maximumFractionDigits: 2 }), + Number(formatUnits(walletPoints, 18)).toLocaleString('en-US', { maximumFractionDigits: 2 }), + Number(formatUnits(combinedPoints, 18)).toLocaleString('en-US', { maximumFractionDigits: 2 }), + claimedVAPE.toFixed(4), + vapeValueUSD.toFixed(2), + originalFee.toFixed(2), + dynamicFee.toFixed(2), + originalFee > 0 ? originalROI.toFixed(2) : 'N/A', + dynamicFee > 0 ? dynamicROI.toFixed(2) : 'N/A', + originalFee > 0 ? originalProfitLoss.toFixed(2) : 'N/A', + dynamicFee > 0 ? dynamicProfitLoss.toFixed(2) : 'N/A', + originalFee > 0 ? (isOriginalProfitable ? 'Yes' : 'No') : 'Free Tier', + dynamicFee > 0 ? (isDynamicProfitable ? 'Yes' : 'No') : 'Free Tier', + ]) + } + + rows.push([]) + rows.push(['SUMMARY STATISTICS']) + rows.push([]) + rows.push(['Metric', 'Value']) + rows.push(['Season', SEASON_ID.toString()]) + rows.push(['VAPE Price at Season', `$${VAPE_PRICE_AT_SEASON.toFixed(4)}`]) + rows.push(['Reference VAPE Price (Original Fee Design)', `$${REFERENCE_VAPE_PRICE.toFixed(4)}`]) + rows.push(['Price Multiplier', (VAPE_PRICE_AT_SEASON / REFERENCE_VAPE_PRICE).toFixed(4)]) + rows.push([]) + rows.push(['Total Users', users.length.toString()]) + rows.push(['Users with Paid Pass (Tier 1+)', usersWithPaidPass.toString()]) + rows.push(['Users on Free Tier (Tier 0)', (users.length - usersWithPaidPass).toString()]) + rows.push([]) + rows.push(['Total Original Fees Collected', `$${totalOriginalFees.toFixed(2)}`]) + rows.push(['Total Dynamic Fees (Proposed)', `$${totalDynamicFees.toFixed(2)}`]) + rows.push(['Fee Reduction', `${((1 - totalDynamicFees / totalOriginalFees) * 100).toFixed(1)}%`]) + rows.push([]) + rows.push(['Total VAPE Value Distributed', `$${totalVAPEValue.toFixed(2)}`]) + rows.push([]) + rows.push(['PROFITABILITY ANALYSIS (Paid Pass Users Only)']) + rows.push(['Original Pricing - Profitable Users', `${originalProfitable} / ${usersWithPaidPass} (${(originalProfitable / usersWithPaidPass * 100).toFixed(1)}%)`]) + rows.push(['Dynamic Pricing - Profitable Users', `${dynamicProfitable} / ${usersWithPaidPass} (${(dynamicProfitable / usersWithPaidPass * 100).toFixed(1)}%)`]) + rows.push(['Improvement', `+${dynamicProfitable - originalProfitable} users (+${((dynamicProfitable - originalProfitable) / usersWithPaidPass * 100).toFixed(1)}%)`]) + rows.push([]) + rows.push(['Average Original ROI', `${(totalVAPEValue / totalOriginalFees).toFixed(2)}x`]) + rows.push(['Average Dynamic ROI', `${(totalVAPEValue / totalDynamicFees).toFixed(2)}x`]) + rows.push([]) + rows.push(['PRICING MODEL']) + rows.push(['Formula', 'Dynamic Fee = Original Fee × (Current VAPE Price / Reference VAPE Price)']) + rows.push(['Example (Tier 10)', `$100 × ($${VAPE_PRICE_AT_SEASON} / $${REFERENCE_VAPE_PRICE}) = $${calculateDynamicFee(10, VAPE_PRICE_AT_SEASON).toFixed(2)}`]) + rows.push([]) + rows.push(['TIER FEE COMPARISON']) + rows.push(['Tier', 'Deposit Limit', 'Original Fee', 'Dynamic Fee', 'Reduction']) + + for (let tier = 0; tier <= 10; tier++) { + const origFee = ORIGINAL_TIER_FEES_USDC[tier] + const dynFee = calculateDynamicFee(tier, VAPE_PRICE_AT_SEASON) + const reduction = origFee > 0 ? `${((1 - dynFee / origFee) * 100).toFixed(0)}%` : 'N/A' + rows.push([ + tier.toString(), + TIER_DEPOSIT_LIMITS_DISPLAY[tier] + ' VPND', + `$${origFee.toFixed(2)}`, + `$${dynFee.toFixed(2)}`, + reduction, + ]) + } + + const csvContent = rows.map(row => row.map(cell => `"${cell}"`).join(',')).join('\n') + + const filename = `VaporFi_LiquidMining_Season${SEASON_ID}_Analysis_${new Date().toISOString().split('T')[0]}.csv` + const filepath = `scripts/simulation/${filename}` + + fs.writeFileSync(filepath, csvContent) + + console.log('✅ Export Complete!') + console.log(`📁 File saved: ${filepath}`) + console.log('') + console.log('Summary:') + console.log(` • Total Users: ${users.length}`) + console.log(` • Users with Paid Pass: ${usersWithPaidPass}`) + console.log(` • Original Profitable: ${originalProfitable}/${usersWithPaidPass} (${(originalProfitable / usersWithPaidPass * 100).toFixed(1)}%)`) + console.log(` • Dynamic Profitable: ${dynamicProfitable}/${usersWithPaidPass} (${(dynamicProfitable / usersWithPaidPass * 100).toFixed(1)}%)`) + console.log(` • Fee Reduction: ${((1 - totalDynamicFees / totalOriginalFees) * 100).toFixed(1)}%`) +} + +main().catch(console.error) diff --git a/scripts/simulation/miningPassPricing.ts b/scripts/simulation/miningPassPricing.ts new file mode 100644 index 0000000..b89abb2 --- /dev/null +++ b/scripts/simulation/miningPassPricing.ts @@ -0,0 +1,414 @@ +import { createPublicClient, http, formatUnits, parseUnits, type Address } from 'viem' +import { avalanche } from 'viem/chains' + +const LIQUID_MINING_DIAMOND = '0xAe950fdd0CC79DDE64d3Fffd40fabec3f7ba368B' as Address +const VAPE_TOKEN = '0x7bddaF6DbAB30224AA2116c4291521C7a60D5f55' as Address + +const REFERENCE_VAPE_PRICE = 0.606 + +const TIER_DEPOSIT_LIMITS: Record = { + 0: parseUnits('5000', 18), + 1: parseUnits('10000', 18), + 2: parseUnits('25000', 18), + 3: parseUnits('60000', 18), + 4: parseUnits('150000', 18), + 5: parseUnits('350000', 18), + 6: parseUnits('800000', 18), + 7: parseUnits('1800000', 18), + 8: parseUnits('4500000', 18), + 9: parseUnits('12000000', 18), + 10: BigInt('115792089237316195423570985008687907853269984665640564039457584007913129639935'), +} + +const ORIGINAL_TIER_FEES_USDC: Record = { + 0: 0, + 1: 0.5, + 2: 1, + 3: 2, + 4: 4, + 5: 8, + 6: 15, + 7: 30, + 8: 50, + 9: 75, + 10: 100, +} + +const diamondAbi = [ + { + inputs: [], + name: 'getCurrentSeasonId', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ name: 'seasonId', type: 'uint256' }], + name: 'getSeasonData', + outputs: [ + { + components: [ + { name: 'id', type: 'uint256' }, + { name: 'startTimestamp', type: 'uint256' }, + { name: 'endTimestamp', type: 'uint256' }, + { name: 'rewardTokensToDistribute', type: 'uint256' }, + { name: 'rewardTokenBalance', type: 'uint256' }, + { name: 'totalDepositAmount', type: 'uint256' }, + { name: 'totalClaimAmount', type: 'uint256' }, + { name: 'totalPoints', type: 'uint256' }, + ], + type: 'tuple', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ name: 'seasonId', type: 'uint256' }], + name: 'getSeasonTotalPoints', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ name: 'seasonId', type: 'uint256' }], + name: 'getTotalDepositAmountOfSeason', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ name: 'seasonId', type: 'uint256' }], + name: 'getRewardTokensToDistribute', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, +] as const + +interface SeasonData { + id: number + startTimestamp: number + endTimestamp: number + rewardTokensToDistribute: bigint + rewardTokenBalance: bigint + totalDepositAmount: bigint + totalClaimAmount: bigint + totalPoints: bigint + durationDays: number +} + +interface PriceSimulationResult { + tier: number + originalPriceUSDC: number + dynamicPriceUSDC: number + expectedVAPE: number + expectedValueUSD: number + estimatedROI: number + depositLimitVPND: string +} + +interface SeasonSimulation { + seasonId: number + seasonData: SeasonData + vapePrice: number + targetROI: number + historicalAvgPoints: bigint + tierPrices: PriceSimulationResult[] +} + +async function fetchVAPEPrice(): Promise { + try { + const response = await fetch( + 'https://api.coingecko.com/api/v3/simple/price?ids=vaporfi&vs_currencies=usd' + ) + const data = await response.json() + return data.vaporfi?.usd || 0.16 + } catch { + console.log('Failed to fetch VAPE price, using default $0.16') + return 0.16 + } +} + +async function fetchHistoricalVAPEPrice(timestamp: number): Promise { + try { + const date = new Date(timestamp * 1000) + const dateStr = `${date.getDate().toString().padStart(2, '0')}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getFullYear()}` + const response = await fetch( + `https://api.coingecko.com/api/v3/coins/vaporfi/history?date=${dateStr}` + ) + const data = await response.json() + return data.market_data?.current_price?.usd || 0.16 + } catch { + return 0.16 + } +} + +function calculateDynamicPrice( + tier: number, + vapePrice: number, + seasonVAPERewards: bigint, + historicalAvgPoints: bigint, + targetROI: number, + seasonDurationDays: number +): PriceSimulationResult { + const depositLimit = TIER_DEPOSIT_LIMITS[tier] + const originalPrice = ORIGINAL_TIER_FEES_USDC[tier] + + const maxPointsRaw = tier === 10 + ? parseUnits('50000000', 18) * BigInt(seasonDurationDays) + : depositLimit * BigInt(seasonDurationDays) + + const maxPoints = maxPointsRaw + + if (historicalAvgPoints === 0n) { + return { + tier, + originalPriceUSDC: originalPrice, + dynamicPriceUSDC: originalPrice, + expectedVAPE: 0, + expectedValueUSD: 0, + estimatedROI: 0, + depositLimitVPND: tier === 10 ? 'Unlimited' : formatUnits(depositLimit, 18), + } + } + + const shareNumerator = maxPoints * BigInt(1e18) + const shareDenominator = historicalAvgPoints + const expectedVAPE = (seasonVAPERewards * shareNumerator) / shareDenominator / BigInt(1e18) + + const expectedVAPENumber = Number(formatUnits(expectedVAPE, 18)) + const expectedValueUSD = expectedVAPENumber * vapePrice + + const dynamicPriceUSDC = expectedValueUSD / targetROI + + const actualROI = dynamicPriceUSDC > 0 ? expectedValueUSD / dynamicPriceUSDC : 0 + + return { + tier, + originalPriceUSDC: originalPrice, + dynamicPriceUSDC: Math.max(dynamicPriceUSDC, 0.01), + expectedVAPE: expectedVAPENumber, + expectedValueUSD, + estimatedROI: actualROI, + depositLimitVPND: tier === 10 ? 'Unlimited (using 50M for calc)' : formatUnits(depositLimit, 18), + } +} + +function calculateSimpleDynamicPrice( + tier: number, + vapePrice: number, + referenceVAPEPrice: number = 1.0 +): { originalPrice: number; dynamicPrice: number; multiplier: number } { + const originalPrice = ORIGINAL_TIER_FEES_USDC[tier] + const multiplier = vapePrice / referenceVAPEPrice + const dynamicPrice = originalPrice * multiplier + + return { + originalPrice, + dynamicPrice: Math.max(dynamicPrice, 0.01), + multiplier, + } +} + +async function main() { + const client = createPublicClient({ + chain: avalanche, + transport: http(), + }) + + console.log('🔍 Fetching current season data...\n') + + const currentSeasonId = await client.readContract({ + address: LIQUID_MINING_DIAMOND, + abi: diamondAbi, + functionName: 'getCurrentSeasonId', + }) + + console.log(`Current Season ID: ${currentSeasonId}\n`) + + const seasons: SeasonData[] = [] + const maxSeasonsToFetch = Math.min(Number(currentSeasonId), 10) + + console.log('📊 Fetching historical season data...\n') + + for (let i = 1; i <= maxSeasonsToFetch; i++) { + try { + const seasonData = await client.readContract({ + address: LIQUID_MINING_DIAMOND, + abi: diamondAbi, + functionName: 'getSeasonData', + args: [BigInt(i)], + }) + + const durationSeconds = Number(seasonData.endTimestamp - seasonData.startTimestamp) + const durationDays = Math.ceil(durationSeconds / 86400) + + seasons.push({ + id: i, + startTimestamp: Number(seasonData.startTimestamp), + endTimestamp: Number(seasonData.endTimestamp), + rewardTokensToDistribute: seasonData.rewardTokensToDistribute, + rewardTokenBalance: seasonData.rewardTokenBalance, + totalDepositAmount: seasonData.totalDepositAmount, + totalClaimAmount: seasonData.totalClaimAmount, + totalPoints: seasonData.totalPoints, + durationDays, + }) + } catch (e) { + console.log(`Failed to fetch season ${i}`) + } + } + + console.log('═══════════════════════════════════════════════════════════════════') + console.log(' HISTORICAL SEASON DATA ') + console.log('═══════════════════════════════════════════════════════════════════\n') + + for (const season of seasons) { + const startDate = new Date(season.startTimestamp * 1000).toISOString().split('T')[0] + const endDate = new Date(season.endTimestamp * 1000).toISOString().split('T')[0] + + console.log(`Season ${season.id}:`) + console.log(` Duration: ${startDate} to ${endDate} (${season.durationDays} days)`) + console.log(` VAPE Rewards: ${formatUnits(season.rewardTokensToDistribute, 18)} VAPE`) + console.log(` Total Deposits: ${formatUnits(season.totalDepositAmount, 18)} VPND`) + console.log(` Total Points: ${formatUnits(season.totalPoints, 18)}`) + console.log('') + } + + const currentVAPEPrice = await fetchVAPEPrice() + console.log(`\n💰 Current VAPE Price: $${currentVAPEPrice.toFixed(4)}\n`) + + console.log('═══════════════════════════════════════════════════════════════════') + console.log(' SIMPLE DYNAMIC PRICING (VAPE MULTIPLIER) ') + console.log('═══════════════════════════════════════════════════════════════════\n') + + console.log(`Formula: newPrice = originalPrice × (currentVAPEPrice / $${REFERENCE_VAPE_PRICE.toFixed(2)})\n`) + console.log(`Reference VAPE Price (Season 1 start, Jul 7 2023): $${REFERENCE_VAPE_PRICE.toFixed(2)}\n`) + + const simpleResults: { tier: number; original: number; dynamic: number }[] = [] + for (let tier = 0; tier <= 10; tier++) { + const result = calculateSimpleDynamicPrice(tier, currentVAPEPrice, REFERENCE_VAPE_PRICE) + simpleResults.push({ tier, original: result.originalPrice, dynamic: result.dynamicPrice }) + } + + console.log('Tier | Original ($) | Dynamic ($) | Reduction') + console.log('-----|--------------|-------------|----------') + for (const r of simpleResults) { + const reduction = r.original > 0 ? ((r.original - r.dynamic) / r.original * 100).toFixed(0) : 0 + console.log( + ` ${r.tier.toString().padStart(2)} | ${r.original.toFixed(2).padStart(12)} | ${r.dynamic.toFixed(2).padStart(11)} | ${reduction}%` + ) + } + + console.log('\n═══════════════════════════════════════════════════════════════════') + console.log(' ROI-CONTROLLED DYNAMIC PRICING ') + console.log('═══════════════════════════════════════════════════════════════════\n') + + const completedSeasons = seasons.filter(s => s.totalPoints > 0n && s.endTimestamp < Date.now() / 1000) + + if (completedSeasons.length === 0) { + console.log('No completed seasons with data available for ROI-based simulation.\n') + } else { + const recentSeasons = completedSeasons.slice(-3) + const avgTotalPoints = recentSeasons.reduce((sum, s) => sum + s.totalPoints, 0n) / BigInt(recentSeasons.length) + + console.log(`Historical Average Total Points (last ${recentSeasons.length} seasons): ${formatUnits(avgTotalPoints, 18)}\n`) + + const targetROIs = [5, 10, 20] + const currentSeason = seasons[seasons.length - 1] + + for (const targetROI of targetROIs) { + console.log(`\n📈 TARGET ROI: ${targetROI}x (Mining pass = ${(100 / targetROI).toFixed(1)}% of expected value)`) + console.log('─'.repeat(70)) + + const tierResults: PriceSimulationResult[] = [] + for (let tier = 1; tier <= 10; tier++) { + const result = calculateDynamicPrice( + tier, + currentVAPEPrice, + currentSeason.rewardTokensToDistribute, + avgTotalPoints, + targetROI, + currentSeason.durationDays || 25 + ) + tierResults.push(result) + } + + console.log('\nTier | Orig($) | Dynamic($) | Exp.VAPE | Exp.Value($) | Est.ROI') + console.log('-----|---------|------------|------------|--------------|--------') + + for (const r of tierResults) { + console.log( + ` ${r.tier.toString().padStart(2)} | ${r.originalPriceUSDC.toFixed(2).padStart(7)} | ${r.dynamicPriceUSDC.toFixed(2).padStart(10)} | ${r.expectedVAPE.toFixed(0).padStart(10)} | ${r.expectedValueUSD.toFixed(2).padStart(12)} | ${r.estimatedROI.toFixed(1)}x` + ) + } + } + } + + console.log('\n═══════════════════════════════════════════════════════════════════') + console.log(' HISTORICAL SIMULATION - WHAT IF ANALYSIS ') + console.log('═══════════════════════════════════════════════════════════════════\n') + + console.log('Simulating what prices WOULD HAVE BEEN if dynamic pricing was active:\n') + + for (let i = 1; i < completedSeasons.length; i++) { + const season = completedSeasons[i] + const prevSeasons = completedSeasons.slice(Math.max(0, i - 3), i) + const avgPoints = prevSeasons.reduce((sum, s) => sum + s.totalPoints, 0n) / BigInt(prevSeasons.length) + + const historicalPrice = await fetchHistoricalVAPEPrice(season.startTimestamp) + + console.log(`\n📅 Season ${season.id} (started ${new Date(season.startTimestamp * 1000).toISOString().split('T')[0]})`) + console.log(` VAPE Price at start: $${historicalPrice.toFixed(4)}`) + console.log(` VAPE Rewards: ${formatUnits(season.rewardTokensToDistribute, 18)} VAPE`) + console.log(` Avg Historical Points: ${formatUnits(avgPoints, 18)}`) + console.log('') + + const targetROI = 10 + + console.log(` Tier | Original | Simple Dyn. | ROI-Based (${targetROI}x)`) + console.log(' -----|----------|-------------|---------------') + + for (const tier of [1, 5, 10]) { + const original = ORIGINAL_TIER_FEES_USDC[tier] + const simpleDynamic = calculateSimpleDynamicPrice(tier, historicalPrice, REFERENCE_VAPE_PRICE) + const roiBased = calculateDynamicPrice( + tier, + historicalPrice, + season.rewardTokensToDistribute, + avgPoints, + targetROI, + season.durationDays + ) + + console.log( + ` ${tier.toString().padStart(2)} | $${original.toFixed(2).padStart(7)} | $${simpleDynamic.dynamicPrice.toFixed(2).padStart(10)} | $${roiBased.dynamicPriceUSDC.toFixed(2).padStart(13)}` + ) + } + } + + console.log('\n═══════════════════════════════════════════════════════════════════') + console.log(' SUMMARY ') + console.log('═══════════════════════════════════════════════════════════════════\n') + + console.log('Two pricing strategies available:\n') + + console.log('1️⃣ SIMPLE VAPE MULTIPLIER:') + console.log(` - Formula: price = originalPrice × (vapePrice / $${REFERENCE_VAPE_PRICE.toFixed(2)})`) + console.log(' - Pros: Simple, predictable, same formula for all tiers') + console.log(' - Cons: Doesn\'t account for participation levels or expected rewards') + console.log('') + + console.log('2️⃣ ROI-CONTROLLED PRICING:') + console.log(' - Formula: price = expectedRewardValue / targetROI') + console.log(' - Uses historical average points to estimate user\'s share') + console.log(' - Pros: Guarantees target ROI, adapts to participation') + console.log(' - Cons: More complex, prices vary significantly by tier') + console.log('') + + console.log('📌 Recommendation: Start with Simple VAPE Multiplier for quick deployment,') + console.log(' then consider ROI-Controlled for long-term if more precision needed.\n') +} + +main().catch(console.error) diff --git a/scripts/simulation/miningPassROIAnalysis.ts b/scripts/simulation/miningPassROIAnalysis.ts new file mode 100644 index 0000000..84c8d06 --- /dev/null +++ b/scripts/simulation/miningPassROIAnalysis.ts @@ -0,0 +1,426 @@ +import { createPublicClient, http, formatUnits, parseUnits, type Address } from 'viem' +import { avalanche } from 'viem/chains' + +const LIQUID_MINING_DIAMOND = '0xAe950fdd0CC79DDE64d3Fffd40fabec3f7ba368B' as Address +const SUBGRAPH_URL = 'https://liquid-mining-indexer-production.up.railway.app/' + +const REFERENCE_VAPE_PRICE = 0.606 + +const TIER_DEPOSIT_LIMITS: Record = { + 0: parseUnits('5000', 18), + 1: parseUnits('10000', 18), + 2: parseUnits('25000', 18), + 3: parseUnits('60000', 18), + 4: parseUnits('150000', 18), + 5: parseUnits('350000', 18), + 6: parseUnits('800000', 18), + 7: parseUnits('1800000', 18), + 8: parseUnits('4500000', 18), + 9: parseUnits('12000000', 18), + 10: BigInt('115792089237316195423570985008687907853269984665640564039457584007913129639935'), +} + +const ORIGINAL_TIER_FEES_USDC: Record = { + 0: 0, + 1: 0.5, + 2: 1, + 3: 2, + 4: 4, + 5: 8, + 6: 15, + 7: 30, + 8: 50, + 9: 75, + 10: 100, +} + +interface SubgraphUser { + id: string + totalDeposited: string + walletPoints: string + totalClaimed: string + combinedPoints: string + seasonId: string +} + +interface UserAnalysis { + address: string + seasonId: number + depositedVPND: number + tier: number + originalFee: number + dynamicFee: number + claimedVAPE: number + claimedValueUSD: number + originalROI: number + dynamicROI: number +} + +interface SeasonSummary { + seasonId: number + userCount: number + totalDeposited: number + totalClaimed: number + avgOriginalROI: number + avgDynamicROI: number + medianOriginalROI: number + medianDynamicROI: number + positiveROICountOriginal: number + positiveROICountDynamic: number + vapePrice: number +} + +const diamondAbi = [ + { + inputs: [], + name: 'getCurrentSeasonId', + outputs: [{ type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ name: 'seasonId', type: 'uint256' }], + name: 'getSeasonData', + outputs: [ + { + components: [ + { name: 'id', type: 'uint256' }, + { name: 'startTimestamp', type: 'uint256' }, + { name: 'endTimestamp', type: 'uint256' }, + { name: 'rewardTokensToDistribute', type: 'uint256' }, + { name: 'rewardTokenBalance', type: 'uint256' }, + { name: 'totalDepositAmount', type: 'uint256' }, + { name: 'totalClaimAmount', type: 'uint256' }, + { name: 'totalPoints', type: 'uint256' }, + ], + type: 'tuple', + }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const + +async function fetchUsersForSeason(seasonId: number): Promise { + const query = ` + query Season { + users(orderBy: "walletPoints", orderDirection: "desc", where: {seasonId: "${seasonId}"}, limit: 1000) { + items { + id + totalDeposited + walletPoints + totalClaimed + combinedPoints + seasonId + } + } + } + ` + + try { + const response = await fetch(SUBGRAPH_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ query }), + }) + const data = await response.json() + return data.data?.users?.items || [] + } catch (e) { + console.log(`Failed to fetch users for season ${seasonId}:`, e) + return [] + } +} + +async function fetchVAPEPrice(): Promise { + try { + const response = await fetch( + 'https://api.coingecko.com/api/v3/simple/price?ids=vaporfi&vs_currencies=usd' + ) + const data = await response.json() + return data.vaporfi?.usd || 0.16 + } catch { + return 0.16 + } +} + +function getTierFromDeposit(depositedVPND: bigint): number { + for (let tier = 0; tier <= 10; tier++) { + if (depositedVPND <= TIER_DEPOSIT_LIMITS[tier]) { + return tier + } + } + return 10 +} + +function calculateDynamicFee(tier: number, vapePrice: number): number { + const originalFee = ORIGINAL_TIER_FEES_USDC[tier] + const multiplier = vapePrice / REFERENCE_VAPE_PRICE + return Math.max(originalFee * multiplier, 0.01) +} + +function median(values: number[]): number { + if (values.length === 0) return 0 + const sorted = [...values].sort((a, b) => a - b) + const mid = Math.floor(sorted.length / 2) + return sorted.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2 +} + +async function analyzeSeasonROI( + seasonId: number, + vapePrice: number +): Promise<{ users: UserAnalysis[]; summary: SeasonSummary }> { + const subgraphUsers = await fetchUsersForSeason(seasonId) + + if (subgraphUsers.length === 0) { + return { + users: [], + summary: { + seasonId, + userCount: 0, + totalDeposited: 0, + totalClaimed: 0, + avgOriginalROI: 0, + avgDynamicROI: 0, + medianOriginalROI: 0, + medianDynamicROI: 0, + positiveROICountOriginal: 0, + positiveROICountDynamic: 0, + vapePrice, + }, + } + } + + const userAnalyses: UserAnalysis[] = [] + + for (const user of subgraphUsers) { + const depositedVPND = BigInt(user.totalDeposited || '0') + const claimedVAPE = Number(formatUnits(BigInt(user.totalClaimed || '0'), 18)) + + if (depositedVPND === 0n) continue + + const tier = getTierFromDeposit(depositedVPND) + const originalFee = ORIGINAL_TIER_FEES_USDC[tier] + const dynamicFee = calculateDynamicFee(tier, vapePrice) + const claimedValueUSD = claimedVAPE * vapePrice + + const originalROI = originalFee > 0 ? claimedValueUSD / originalFee : Infinity + const dynamicROI = dynamicFee > 0 ? claimedValueUSD / dynamicFee : Infinity + + userAnalyses.push({ + address: user.id.split('-')[0], + seasonId, + depositedVPND: Number(formatUnits(depositedVPND, 18)), + tier, + originalFee, + dynamicFee, + claimedVAPE, + claimedValueUSD, + originalROI: isFinite(originalROI) ? originalROI : 0, + dynamicROI: isFinite(dynamicROI) ? dynamicROI : 0, + }) + } + + const validUsers = userAnalyses.filter(u => u.originalFee > 0 && u.claimedVAPE > 0) + + const originalROIs = validUsers.map(u => u.originalROI) + const dynamicROIs = validUsers.map(u => u.dynamicROI) + + const summary: SeasonSummary = { + seasonId, + userCount: validUsers.length, + totalDeposited: userAnalyses.reduce((sum, u) => sum + u.depositedVPND, 0), + totalClaimed: userAnalyses.reduce((sum, u) => sum + u.claimedVAPE, 0), + avgOriginalROI: originalROIs.length > 0 ? originalROIs.reduce((a, b) => a + b, 0) / originalROIs.length : 0, + avgDynamicROI: dynamicROIs.length > 0 ? dynamicROIs.reduce((a, b) => a + b, 0) / dynamicROIs.length : 0, + medianOriginalROI: median(originalROIs), + medianDynamicROI: median(dynamicROIs), + positiveROICountOriginal: originalROIs.filter(r => r >= 1).length, + positiveROICountDynamic: dynamicROIs.filter(r => r >= 1).length, + vapePrice, + } + + return { users: userAnalyses, summary } +} + +function printTierBreakdown(users: UserAnalysis[], vapePrice: number) { + const tierStats: Record = {} + + for (let tier = 0; tier <= 10; tier++) { + tierStats[tier] = { count: 0, totalOriginalROI: 0, totalDynamicROI: 0, users: [] } + } + + for (const user of users) { + if (user.originalFee > 0 && user.claimedVAPE > 0) { + tierStats[user.tier].count++ + tierStats[user.tier].totalOriginalROI += user.originalROI + tierStats[user.tier].totalDynamicROI += user.dynamicROI + tierStats[user.tier].users.push(user) + } + } + + console.log('\n Tier | Users | Orig Fee | Dyn Fee | Avg Orig ROI | Avg Dyn ROI | Profitable (Orig→Dyn)') + console.log(' -----|-------|----------|----------|--------------|-------------|----------------------') + + for (let tier = 1; tier <= 10; tier++) { + const stats = tierStats[tier] + if (stats.count === 0) continue + + const avgOrigROI = stats.totalOriginalROI / stats.count + const avgDynROI = stats.totalDynamicROI / stats.count + const origFee = ORIGINAL_TIER_FEES_USDC[tier] + const dynFee = calculateDynamicFee(tier, vapePrice) + const profitableOrig = stats.users.filter(u => u.originalROI >= 1).length + const profitableDyn = stats.users.filter(u => u.dynamicROI >= 1).length + + console.log( + ` ${tier.toString().padStart(2)} | ${stats.count.toString().padStart(5)} | $${origFee.toFixed(2).padStart(7)} | $${dynFee.toFixed(2).padStart(7)} | ${avgOrigROI.toFixed(2).padStart(12)}x | ${avgDynROI.toFixed(2).padStart(11)}x | ${profitableOrig}→${profitableDyn} (${((profitableDyn - profitableOrig) / stats.count * 100).toFixed(0)}%↑)` + ) + } +} + +async function main() { + const client = createPublicClient({ + chain: avalanche, + transport: http(), + }) + + console.log('🔍 Mining Pass ROI Analysis with Real User Data\n') + console.log(`Reference VAPE Price (when fees were set): $${REFERENCE_VAPE_PRICE.toFixed(4)}`) + console.log(`Formula: dynamicFee = originalFee × (currentVAPEPrice / $${REFERENCE_VAPE_PRICE.toFixed(2)})\n`) + + const currentSeasonId = await client.readContract({ + address: LIQUID_MINING_DIAMOND, + abi: diamondAbi, + functionName: 'getCurrentSeasonId', + }) + + console.log(`Current Season: ${currentSeasonId}\n`) + + const currentVAPEPrice = await fetchVAPEPrice() + console.log(`💰 Current VAPE Price: $${currentVAPEPrice.toFixed(4)}\n`) + + const seasonsToAnalyze = [15, 20, 25, 30] + const allSummaries: SeasonSummary[] = [] + + const historicalVAPEPrices: Record = { + 15: 0.18, + 20: 0.15, + 25: 0.14, + 30: 0.16, + } + + console.log('═══════════════════════════════════════════════════════════════════') + console.log(' SEASON-BY-SEASON ANALYSIS ') + console.log('═══════════════════════════════════════════════════════════════════') + + for (const seasonId of seasonsToAnalyze) { + console.log(`\n📊 Fetching data for Season ${seasonId}...`) + + const vapePrice = historicalVAPEPrices[seasonId] || currentVAPEPrice + const { users, summary } = await analyzeSeasonROI(seasonId, vapePrice) + + if (summary.userCount === 0) { + console.log(` No user data found for season ${seasonId}`) + continue + } + + allSummaries.push(summary) + + console.log(`\n Season ${seasonId} Summary (VAPE Price: $${vapePrice.toFixed(4)}):`) + console.log(` ├─ Total Users with Paid Pass: ${summary.userCount}`) + console.log(` ├─ Total Deposited: ${summary.totalDeposited.toLocaleString()} VPND`) + console.log(` ├─ Total Claimed: ${summary.totalClaimed.toLocaleString()} VAPE`) + console.log(` │`) + console.log(` ├─ Original Pricing:`) + console.log(` │ ├─ Avg ROI: ${summary.avgOriginalROI.toFixed(2)}x`) + console.log(` │ ├─ Median ROI: ${summary.medianOriginalROI.toFixed(2)}x`) + console.log(` │ └─ Users with ROI ≥ 1x: ${summary.positiveROICountOriginal}/${summary.userCount} (${(summary.positiveROICountOriginal / summary.userCount * 100).toFixed(1)}%)`) + console.log(` │`) + console.log(` └─ Dynamic Pricing:`) + console.log(` ├─ Avg ROI: ${summary.avgDynamicROI.toFixed(2)}x`) + console.log(` ├─ Median ROI: ${summary.medianDynamicROI.toFixed(2)}x`) + console.log(` └─ Users with ROI ≥ 1x: ${summary.positiveROICountDynamic}/${summary.userCount} (${(summary.positiveROICountDynamic / summary.userCount * 100).toFixed(1)}%)`) + + printTierBreakdown(users, vapePrice) + + console.log('\n Top 5 Users by Claimed VAPE:') + const topUsers = users + .filter(u => u.claimedVAPE > 0) + .sort((a, b) => b.claimedVAPE - a.claimedVAPE) + .slice(0, 5) + + console.log(' Address | Tier | Deposited VPND | Claimed VAPE | Orig Fee | Dyn Fee | Orig ROI | Dyn ROI') + console.log(' -------------|------|----------------|--------------|----------|---------|----------|--------') + for (const u of topUsers) { + console.log( + ` ${u.address.slice(0, 10)}.. | ${u.tier.toString().padStart(4)} | ${u.depositedVPND.toLocaleString().padStart(14)} | ${u.claimedVAPE.toFixed(2).padStart(12)} | $${u.originalFee.toFixed(2).padStart(6)} | $${u.dynamicFee.toFixed(2).padStart(5)} | ${u.originalROI.toFixed(2).padStart(8)}x | ${u.dynamicROI.toFixed(2).padStart(6)}x` + ) + } + + console.log('\n Bottom 5 Users by ROI (paid pass, got rewards):') + const bottomUsers = users + .filter(u => u.claimedVAPE > 0 && u.originalFee > 0) + .sort((a, b) => a.originalROI - b.originalROI) + .slice(0, 5) + + for (const u of bottomUsers) { + console.log( + ` ${u.address.slice(0, 10)}.. | ${u.tier.toString().padStart(4)} | ${u.depositedVPND.toLocaleString().padStart(14)} | ${u.claimedVAPE.toFixed(2).padStart(12)} | $${u.originalFee.toFixed(2).padStart(6)} | $${u.dynamicFee.toFixed(2).padStart(5)} | ${u.originalROI.toFixed(2).padStart(8)}x | ${u.dynamicROI.toFixed(2).padStart(6)}x` + ) + } + } + + console.log('\n═══════════════════════════════════════════════════════════════════') + console.log(' OVERALL SUMMARY ') + console.log('═══════════════════════════════════════════════════════════════════\n') + + if (allSummaries.length > 0) { + const totalUsers = allSummaries.reduce((sum, s) => sum + s.userCount, 0) + const avgOrigROI = allSummaries.reduce((sum, s) => sum + s.avgOriginalROI, 0) / allSummaries.length + const avgDynROI = allSummaries.reduce((sum, s) => sum + s.avgDynamicROI, 0) / allSummaries.length + const totalProfitableOrig = allSummaries.reduce((sum, s) => sum + s.positiveROICountOriginal, 0) + const totalProfitableDyn = allSummaries.reduce((sum, s) => sum + s.positiveROICountDynamic, 0) + + console.log(`Total Users Analyzed: ${totalUsers}`) + console.log(`Seasons Analyzed: ${allSummaries.map(s => s.seasonId).join(', ')}\n`) + + console.log('Comparison:') + console.log('┌─────────────────────┬────────────────┬────────────────┐') + console.log('│ Metric │ Original Fees │ Dynamic Fees │') + console.log('├─────────────────────┼────────────────┼────────────────┤') + console.log(`│ Avg ROI │ ${avgOrigROI.toFixed(2).padStart(13)}x │ ${avgDynROI.toFixed(2).padStart(13)}x │`) + console.log(`│ Profitable Users │ ${totalProfitableOrig.toString().padStart(14)} │ ${totalProfitableDyn.toString().padStart(14)} │`) + console.log(`│ Profitable Rate │ ${(totalProfitableOrig / totalUsers * 100).toFixed(1).padStart(13)}% │ ${(totalProfitableDyn / totalUsers * 100).toFixed(1).padStart(13)}% │`) + console.log('└─────────────────────┴────────────────┴────────────────┘\n') + + const improvement = ((totalProfitableDyn - totalProfitableOrig) / totalProfitableOrig * 100).toFixed(1) + console.log(`📈 Dynamic pricing would increase profitable user rate by ${improvement}%`) + console.log(` (${totalProfitableDyn - totalProfitableOrig} more users would have broken even or profited)\n`) + } + + console.log('═══════════════════════════════════════════════════════════════════') + console.log(' FEE COMPARISON TABLE ') + console.log('═══════════════════════════════════════════════════════════════════\n') + + console.log(`At current VAPE price ($${currentVAPEPrice.toFixed(4)}):\n`) + console.log('Tier | Deposit Limit | Original Fee | Dynamic Fee | Reduction') + console.log('-----|------------------|--------------|-------------|----------') + + for (let tier = 1; tier <= 10; tier++) { + const limit = tier === 10 ? 'Unlimited' : `${Number(formatUnits(TIER_DEPOSIT_LIMITS[tier], 18)).toLocaleString()} VPND` + const origFee = ORIGINAL_TIER_FEES_USDC[tier] + const dynFee = calculateDynamicFee(tier, currentVAPEPrice) + const reduction = ((origFee - dynFee) / origFee * 100).toFixed(0) + + console.log( + ` ${tier.toString().padStart(2)} | ${limit.padStart(16)} | $${origFee.toFixed(2).padStart(10)} | $${dynFee.toFixed(2).padStart(9)} | ${reduction}%` + ) + } + + console.log('\n📌 Recommendation:') + console.log(' The dynamic pricing model significantly improves user ROI by reducing') + console.log(' fees proportionally to VAPE price decline. This maintains the original') + console.log(' value proposition established when fees were set.\n') +} + +main().catch(console.error) diff --git a/scripts/simulation/unprofitableAnalysis.ts b/scripts/simulation/unprofitableAnalysis.ts new file mode 100644 index 0000000..0c73a8c --- /dev/null +++ b/scripts/simulation/unprofitableAnalysis.ts @@ -0,0 +1,206 @@ +import * as fs from 'fs' + +const csv = fs.readFileSync('scripts/simulation/VaporFi_LiquidMining_Season30_Analysis_2026-01-30.csv', 'utf-8') +const lines = csv.split('\n').slice(1) + +const tierLimits: Record = { + '5,000': 5000, + '10,000': 10000, + '25,000': 25000, + '60,000': 60000, + '150,000': 150000, + '350,000': 350000, + '800,000': 800000, + '1,800,000': 1800000, + '4,500,000': 4500000, + '12,000,000': 12000000, +} + +interface UnprofitableUser { + wallet: string + tier: number + tierLimit: string + deposited: number + depositedStr: string + utilization: number + vapeValueUSD: number + originalFee: number + roi: number + loss: number +} + +const unprofitableUsers: UnprofitableUser[] = [] + +for (const line of lines) { + if (!line.includes('0x')) continue + + const cols = line.match(/"([^"]*)"/g)?.map((c) => c.replace(/"/g, '')) || [] + if (cols.length < 16) continue + + const [wallet, tier, limitStr, depositedStr, , , , vapeValueStr, origFeeStr, , origROI, , origProfitLoss, , origProfitable] = cols + + if (tier === '0' || origProfitable === 'Free Tier') continue + if (origProfitable === 'Yes') continue + + const limit = tierLimits[limitStr] || 0 + const deposited = parseFloat(depositedStr.replace(/,/g, '')) + const utilization = (deposited / limit) * 100 + const vapeValueUSD = parseFloat(vapeValueStr) + const originalFee = parseFloat(origFeeStr) + const roi = parseFloat(origROI) + const loss = parseFloat(origProfitLoss) + + unprofitableUsers.push({ + wallet, + tier: parseInt(tier), + tierLimit: limitStr, + deposited, + depositedStr, + utilization, + vapeValueUSD, + originalFee, + roi, + loss, + }) +} + +console.log('═'.repeat(80)) +console.log('📊 UNPROFITABLE USERS ANALYSIS - SEASON 30') +console.log('═'.repeat(80)) + +console.log(`\nTotal Unprofitable Users: ${unprofitableUsers.length}`) + +// Tier breakdown +console.log('\n' + '─'.repeat(80)) +console.log('BREAKDOWN BY TIER') +console.log('─'.repeat(80)) + +const tierStats: Record = {} + +for (const user of unprofitableUsers) { + if (!tierStats[user.tier]) { + tierStats[user.tier] = { count: 0, totalLoss: 0, avgROI: 0, avgUtil: 0, rois: [], utils: [] } + } + tierStats[user.tier].count++ + tierStats[user.tier].totalLoss += Math.abs(user.loss) + tierStats[user.tier].rois.push(user.roi) + tierStats[user.tier].utils.push(user.utilization) +} + +console.log('\nTier | Users | Total Loss | Avg Loss | Avg ROI | Avg Utilization') +console.log('─'.repeat(70)) + +let grandTotalLoss = 0 +for (const tier of Object.keys(tierStats).map(Number).sort((a, b) => a - b)) { + const stats = tierStats[tier] + const avgROI = (stats.rois.reduce((a, b) => a + b, 0) / stats.count).toFixed(2) + const avgUtil = (stats.utils.reduce((a, b) => a + b, 0) / stats.count).toFixed(1) + const avgLoss = (stats.totalLoss / stats.count).toFixed(2) + grandTotalLoss += stats.totalLoss + console.log(` ${tier} | ${String(stats.count).padStart(2)} | $${stats.totalLoss.toFixed(2).padStart(7)} | $${avgLoss.padStart(5)} | ${avgROI}x | ${avgUtil}%`) +} + +console.log('─'.repeat(70)) +console.log(`TOTAL | ${unprofitableUsers.length} | $${grandTotalLoss.toFixed(2).padStart(7)} | $${(grandTotalLoss / unprofitableUsers.length).toFixed(2).padStart(5)} |`) + +// Utilization breakdown +console.log('\n' + '─'.repeat(80)) +console.log('BREAKDOWN BY UTILIZATION') +console.log('─'.repeat(80)) + +const utilizationBuckets = { + '100% (maxed)': unprofitableUsers.filter(u => u.utilization >= 99), + '90-99%': unprofitableUsers.filter(u => u.utilization >= 90 && u.utilization < 99), + '75-90%': unprofitableUsers.filter(u => u.utilization >= 75 && u.utilization < 90), + '50-75%': unprofitableUsers.filter(u => u.utilization >= 50 && u.utilization < 75), + '<50%': unprofitableUsers.filter(u => u.utilization < 50), +} + +console.log('\nUtilization | Users | % of Total | Total Loss | Avg ROI') +console.log('─'.repeat(65)) + +for (const [bucket, users] of Object.entries(utilizationBuckets)) { + if (users.length === 0) continue + const totalLoss = users.reduce((sum, u) => sum + Math.abs(u.loss), 0) + const avgROI = (users.reduce((sum, u) => sum + u.roi, 0) / users.length).toFixed(2) + const pct = ((users.length / unprofitableUsers.length) * 100).toFixed(1) + console.log(`${bucket.padEnd(12)} | ${String(users.length).padStart(2)} | ${pct.padStart(5)}% | $${totalLoss.toFixed(2).padStart(7)} | ${avgROI}x`) +} + +// ROI breakdown +console.log('\n' + '─'.repeat(80)) +console.log('BREAKDOWN BY ROI (How close to break-even)') +console.log('─'.repeat(80)) + +const roiBuckets = { + '0.9-0.99x (very close)': unprofitableUsers.filter(u => u.roi >= 0.9), + '0.7-0.89x (moderate)': unprofitableUsers.filter(u => u.roi >= 0.7 && u.roi < 0.9), + '0.5-0.69x (significant)': unprofitableUsers.filter(u => u.roi >= 0.5 && u.roi < 0.7), + '0.3-0.49x (heavy)': unprofitableUsers.filter(u => u.roi >= 0.3 && u.roi < 0.5), + '<0.3x (severe)': unprofitableUsers.filter(u => u.roi < 0.3), +} + +console.log('\nROI Range | Users | % of Total | Avg Loss | Would be profitable w/ dynamic?') +console.log('─'.repeat(85)) + +const VAPE_PRICE = 0.16 +const REF_PRICE = 0.606 + +for (const [bucket, users] of Object.entries(roiBuckets)) { + if (users.length === 0) continue + const avgLoss = (users.reduce((sum, u) => sum + Math.abs(u.loss), 0) / users.length).toFixed(2) + const pct = ((users.length / unprofitableUsers.length) * 100).toFixed(1) + + // Check how many would be profitable with dynamic pricing + const wouldBeProfit = users.filter(u => { + const dynamicFee = u.originalFee * (VAPE_PRICE / REF_PRICE) + return u.vapeValueUSD >= dynamicFee + }).length + + console.log(`${bucket.padEnd(20)} | ${String(users.length).padStart(2)} | ${pct.padStart(5)}% | $${avgLoss.padStart(5)} | ${wouldBeProfit}/${users.length} (${((wouldBeProfit / users.length) * 100).toFixed(0)}%)`) +} + +// Worst losses +console.log('\n' + '─'.repeat(80)) +console.log('TOP 10 BIGGEST LOSSES') +console.log('─'.repeat(80)) + +const sorted = [...unprofitableUsers].sort((a, b) => a.loss - b.loss) +console.log('\nWallet | Tier | Deposited | VAPE Value | Fee | Loss | ROI') +console.log('─'.repeat(105)) + +for (const user of sorted.slice(0, 10)) { + console.log( + `${user.wallet.slice(0, 42)} | ${String(user.tier).padStart(4)} | ${user.depositedStr.padStart(15)} | $${user.vapeValueUSD.toFixed(2).padStart(7)} | $${user.originalFee.toFixed(2).padStart(5)} | -$${Math.abs(user.loss).toFixed(2).padStart(5)} | ${user.roi.toFixed(2)}x` + ) +} + +// Summary +console.log('\n' + '═'.repeat(80)) +console.log('KEY INSIGHTS') +console.log('═'.repeat(80)) + +const maxedUsers = unprofitableUsers.filter(u => u.utilization >= 95) +const underUsers = unprofitableUsers.filter(u => u.utilization < 95) +const wouldBeProfitDynamic = unprofitableUsers.filter(u => { + const dynamicFee = u.originalFee * (VAPE_PRICE / REF_PRICE) + return u.vapeValueUSD >= dynamicFee +}).length + +console.log(` +1. UTILIZATION IS NOT THE PROBLEM + • ${maxedUsers.length}/${unprofitableUsers.length} (${((maxedUsers.length / unprofitableUsers.length) * 100).toFixed(0)}%) unprofitable users MAXED their tier deposit + • Even 100% utilization doesn't guarantee profit at current VAPE price + +2. LOWER TIERS HIT HARDEST + • Tier 1-4 account for ${unprofitableUsers.filter(u => u.tier <= 4).length}/${unprofitableUsers.length} unprofitable users + • These users pay $0.50-$4 fees for small deposits that can't generate enough rewards + +3. DYNAMIC PRICING WOULD FIX ${((wouldBeProfitDynamic / unprofitableUsers.length) * 100).toFixed(0)}% OF CASES + • ${wouldBeProfitDynamic}/${unprofitableUsers.length} unprofitable users would become profitable + • Only ${unprofitableUsers.length - wouldBeProfitDynamic} would remain unprofitable (very low engagement) + +4. TOTAL LOSSES: $${grandTotalLoss.toFixed(2)} + • Average loss per user: $${(grandTotalLoss / unprofitableUsers.length).toFixed(2)} + • This is money users lost to fees they couldn't recover +`) diff --git a/src/facets/DiamondManagerFacet.sol b/src/facets/DiamondManagerFacet.sol index 36b86ad..142c61f 100644 --- a/src/facets/DiamondManagerFacet.sol +++ b/src/facets/DiamondManagerFacet.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.18; -import { LDiamond } from "clouds/diamond/LDiamond.sol"; -import { IERC20 } from "openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {LDiamond} from "clouds/diamond/LDiamond.sol"; +import {IERC20} from "openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { AppStorage, UserData, Season } from "../libraries/AppStorage.sol"; -import { IEmissionsManager } from "../interfaces/IEmissionsManager.sol"; +import {AppStorage, UserData, Season} from "../libraries/AppStorage.sol"; +import {IEmissionsManager} from "../interfaces/IEmissionsManager.sol"; error DiamondManagerFacet__Not_Owner(); error DiamondManagerFacet__Invalid_Address(); @@ -14,6 +14,8 @@ error DiamondManagerFacet__Season_Not_Finished(); error DiamondManagerFacet_InvalidArgs_ChangeBoostPoints(); error DiamondManagerFacet__NotGelatoExecutor(); error DiamondManagerFacet__NotAuthorized(); +error DiamondManagerFacet__FeeBelowFloor(); +error DiamondManagerFacet__InvalidTier(); contract DiamondManagerFacet { AppStorage s; @@ -38,6 +40,8 @@ contract DiamondManagerFacet { event SeasonStarted(uint256 indexed seasonId, uint256 rewardTokenToDistribute); event SeasonEnded(uint256 indexed seasonId, uint256 rewardTokenDistributed); event MiningPassFeeReceiversSet(address[] receivers, uint256[] proportion); + event MiningPassFeesUpdated(uint256[] fees); + event MiningPassFeeFloorUpdated(uint256 floorBps); modifier onlyOwner() { if (msg.sender != LDiamond.contractOwner()) { @@ -128,6 +132,68 @@ contract DiamondManagerFacet { emit MiningPassFeeReceiversSet(receivers, proportion); } + /// @notice Update mining pass fees for all tiers (dynamic pricing) + /// @dev Fees must be >= floor price (25% of base fee by default) + /// @param fees Array of 11 fees for tiers 0-10 (in USDC with 6 decimals) + function setMiningPassFees(uint256[] calldata fees) external onlyOwner { + if (fees.length != 11) { + revert DiamondManagerFacet__Invalid_Input(); + } + + uint256 floorBps = s.miningPassFeeFloorBps; + + for (uint256 i; i < 11;) { + uint256 baseFee = s.baseMiningPassTierToFee[i]; + uint256 floorFee = (baseFee * floorBps) / TOTAL_SHARES; + + // Fee must be >= floor price (but tier 0 is always free) + if (i > 0 && fees[i] < floorFee) { + revert DiamondManagerFacet__FeeBelowFloor(); + } + + s.miningPassTierToFee[i] = fees[i]; + + unchecked { + i++; + } + } + + emit MiningPassFeesUpdated(fees); + } + + /// @notice Update a single mining pass tier fee + /// @param tier The tier to update (0-10) + /// @param fee The new fee in USDC (6 decimals) + function setMiningPassTierFee(uint256 tier, uint256 fee) external onlyOwner { + if (tier > 10) { + revert DiamondManagerFacet__InvalidTier(); + } + + uint256 baseFee = s.baseMiningPassTierToFee[tier]; + uint256 floorFee = (baseFee * s.miningPassFeeFloorBps) / TOTAL_SHARES; + + // Fee must be >= floor price (but tier 0 is always free) + if (tier > 0 && fee < floorFee) { + revert DiamondManagerFacet__FeeBelowFloor(); + } + + s.miningPassTierToFee[tier] = fee; + + uint256[] memory fees = new uint256[](1); + fees[0] = fee; + emit MiningPassFeesUpdated(fees); + } + + /// @notice Update the floor price percentage for mining pass fees + /// @param floorBps Floor price in basis points (e.g., 2500 = 25%) + function setMiningPassFeeFloor(uint256 floorBps) external onlyOwner { + if (floorBps > TOTAL_SHARES) { + revert DiamondManagerFacet__Invalid_Input(); + } + s.miningPassFeeFloorBps = floorBps; + emit MiningPassFeeFloorUpdated(floorBps); + } + function setRewardToken(address token) external validAddress(token) onlyOwner { s.rewardToken = token; } @@ -166,10 +232,10 @@ contract DiamondManagerFacet { emit SeasonStarted(s.currentSeasonId, _rewardTokenToDistribute); } - function startNewSeasonWithEndTimestamp( - uint256 _rewardTokenToDistribute, - uint256 _endTimestamp - ) external onlyAuthorized { + function startNewSeasonWithEndTimestamp(uint256 _rewardTokenToDistribute, uint256 _endTimestamp) + external + onlyAuthorized + { uint256 _currentSeason = s.currentSeasonId; if (_currentSeason != 0 && s.seasons[_currentSeason].endTimestamp >= block.timestamp) { revert DiamondManagerFacet__Season_Not_Finished(); @@ -219,10 +285,10 @@ contract DiamondManagerFacet { emit EmissionsManagerSet(_emissionManager); } - function setUnlockTimestampDiscountForStratosphereMember( - uint256 tier, - uint256 discountBasisPoints - ) external onlyOwner { + function setUnlockTimestampDiscountForStratosphereMember(uint256 tier, uint256 discountBasisPoints) + external + onlyOwner + { s.unlockTimestampDiscountForStratosphereMembers[tier] = discountBasisPoints; emit UnlockTimestampDiscountForStratosphereMemberSet(tier, discountBasisPoints); } @@ -365,9 +431,11 @@ contract DiamondManagerFacet { return s.seasons[seasonId].rewardTokensToDistribute; } - function getCurrentSeasonUserDetails( - address _account - ) external view returns (uint256 depositAmount, uint256 poolShareBips, uint256 estimatedRewards) { + function getCurrentSeasonUserDetails(address _account) + external + view + returns (uint256 depositAmount, uint256 poolShareBips, uint256 estimatedRewards) + { uint256 _currentSeasonId = s.currentSeasonId; UserData memory _userData = s.usersData[_currentSeasonId][_account]; Season memory _season = s.seasons[_currentSeasonId]; @@ -381,4 +449,52 @@ contract DiamondManagerFacet { function getSeasonIsClaimed(uint256 seasonId) external view returns (bool) { return s.isSeasonClaimed[seasonId]; } + + /// @notice Get the current mining pass fee for a tier + /// @param tier The tier to query (0-10) + /// @return fee The current fee in USDC (6 decimals) + function getMiningPassTierFee(uint256 tier) external view returns (uint256) { + return s.miningPassTierToFee[tier]; + } + + /// @notice Get the base (original) mining pass fee for a tier + /// @param tier The tier to query (0-10) + /// @return fee The base fee in USDC (6 decimals) + function getBaseMiningPassTierFee(uint256 tier) external view returns (uint256) { + return s.baseMiningPassTierToFee[tier]; + } + + /// @notice Get the floor price for a tier + /// @param tier The tier to query (0-10) + /// @return floorFee The minimum allowed fee in USDC (6 decimals) + function getMiningPassTierFloorFee(uint256 tier) external view returns (uint256) { + uint256 baseFee = s.baseMiningPassTierToFee[tier]; + return (baseFee * s.miningPassFeeFloorBps) / TOTAL_SHARES; + } + + /// @notice Get the floor price percentage + /// @return floorBps Floor price in basis points (e.g., 2500 = 25%) + function getMiningPassFeeFloorBps() external view returns (uint256) { + return s.miningPassFeeFloorBps; + } + + /// @notice Get all current mining pass fees + /// @return fees Array of 11 fees for tiers 0-10 + function getAllMiningPassFees() external view returns (uint256[] memory) { + uint256[] memory fees = new uint256[](11); + for (uint256 i; i < 11;) { + fees[i] = s.miningPassTierToFee[i]; + unchecked { + i++; + } + } + return fees; + } + + /// @notice Get deposit limit for a mining pass tier + /// @param tier The tier to query (0-10) + /// @return limit The deposit limit in VPND (18 decimals) + function getMiningPassTierDepositLimit(uint256 tier) external view returns (uint256) { + return s.miningPassTierToDepositLimit[tier]; + } } diff --git a/src/libraries/AppStorage.sol b/src/libraries/AppStorage.sol index 408ed7c..c65667f 100644 --- a/src/libraries/AppStorage.sol +++ b/src/libraries/AppStorage.sol @@ -77,6 +77,10 @@ struct AppStorage { mapping(uint256 => uint256) miningPassTierToDepositLimit; address[] miningPassFeeReceivers; uint256[] miningPassFeeReceiversShares; + /// @dev Base fees (original fees set at deployment, used for floor price calculation) + mapping(uint256 => uint256) baseMiningPassTierToFee; + /// @dev Floor price percentage in basis points (e.g., 2500 = 25%) + uint256 miningPassFeeFloorBps; /////////////// /// GENERAL /// /////////////// diff --git a/src/upgradeInitializers/DiamondInit.sol b/src/upgradeInitializers/DiamondInit.sol index 83d7a86..89e47f1 100644 --- a/src/upgradeInitializers/DiamondInit.sol +++ b/src/upgradeInitializers/DiamondInit.sol @@ -8,12 +8,12 @@ pragma solidity 0.8.18; * Implementation of a diamond. /******************************************************************************/ -import { LDiamond } from "clouds/diamond/LDiamond.sol"; -import { IDiamondLoupe } from "clouds/interfaces/IDiamondLoupe.sol"; -import { IDiamondCut } from "clouds/interfaces/IDiamondCut.sol"; -import { IERC173 } from "clouds/interfaces/IERC173.sol"; -import { IERC165 } from "clouds/interfaces/IERC165.sol"; -import { AppStorage } from "../libraries/AppStorage.sol"; +import {LDiamond} from "clouds/diamond/LDiamond.sol"; +import {IDiamondLoupe} from "clouds/interfaces/IDiamondLoupe.sol"; +import {IDiamondCut} from "clouds/interfaces/IDiamondCut.sol"; +import {IERC173} from "clouds/interfaces/IERC173.sol"; +import {IERC165} from "clouds/interfaces/IERC165.sol"; +import {AppStorage} from "../libraries/AppStorage.sol"; // It is expected that this contract is customized if you want to deploy your diamond // with data from a deployment script. Use the init function to initialize state variables @@ -119,6 +119,19 @@ contract DiamondInit { // MiningPassFacet /// @dev fee is paid in USDC + /// @dev Base fees (original fees, used for floor price calculation) + s.baseMiningPassTierToFee[0] = 0; + s.baseMiningPassTierToFee[1] = 0.5 * 1e6; + s.baseMiningPassTierToFee[2] = 1 * 1e6; + s.baseMiningPassTierToFee[3] = 2 * 1e6; + s.baseMiningPassTierToFee[4] = 4 * 1e6; + s.baseMiningPassTierToFee[5] = 8 * 1e6; + s.baseMiningPassTierToFee[6] = 15 * 1e6; + s.baseMiningPassTierToFee[7] = 30 * 1e6; + s.baseMiningPassTierToFee[8] = 50 * 1e6; + s.baseMiningPassTierToFee[9] = 75 * 1e6; + s.baseMiningPassTierToFee[10] = 100 * 1e6; + /// @dev Current fees (can be updated for dynamic pricing) s.miningPassTierToFee[0] = 0; s.miningPassTierToFee[1] = 0.5 * 1e6; s.miningPassTierToFee[2] = 1 * 1e6; @@ -130,6 +143,8 @@ contract DiamondInit { s.miningPassTierToFee[8] = 50 * 1e6; s.miningPassTierToFee[9] = 75 * 1e6; s.miningPassTierToFee[10] = 100 * 1e6; + /// @dev Floor price is 25% of base fee (2500 basis points) + s.miningPassFeeFloorBps = 2500; /// @dev deposit limit is in VPND s.miningPassTierToDepositLimit[0] = 5_000 * 1e18; s.miningPassTierToDepositLimit[1] = 10_000 * 1e18; diff --git a/test/foundry/Facets/MiningPassDynamicPricing.t.sol b/test/foundry/Facets/MiningPassDynamicPricing.t.sol new file mode 100644 index 0000000..9cced2e --- /dev/null +++ b/test/foundry/Facets/MiningPassDynamicPricing.t.sol @@ -0,0 +1,392 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.18; + +import "forge-std/Test.sol"; +import {DiamondTest, LiquidMiningDiamond} from "../utils/DiamondTest.sol"; +import {DiamondManagerFacet} from "src/facets/DiamondManagerFacet.sol"; +import "src/facets/MiningPassFacet.sol"; + +error DiamondManagerFacet__Not_Owner(); +error DiamondManagerFacet__Invalid_Input(); +error DiamondManagerFacet__FeeBelowFloor(); +error DiamondManagerFacet__InvalidTier(); + +contract MiningPassDynamicPricingTest is DiamondTest { + LiquidMiningDiamond internal diamond; + DiamondManagerFacet internal diamondManagerFacet; + MiningPassFacet internal miningPassFacet; + + address internal owner = makeAddr("diamondOwner"); + address internal user = makeAddr("user"); + + // Original fees in USDC (6 decimals) + uint256[] internal originalFees = [ + 0, // Tier 0 + 0.5 * 1e6, // Tier 1 + 1 * 1e6, // Tier 2 + 2 * 1e6, // Tier 3 + 4 * 1e6, // Tier 4 + 8 * 1e6, // Tier 5 + 15 * 1e6, // Tier 6 + 30 * 1e6, // Tier 7 + 50 * 1e6, // Tier 8 + 75 * 1e6, // Tier 9 + 100 * 1e6 // Tier 10 + ]; + + function setUp() public { + vm.startPrank(owner); + + diamond = createDiamond(); + diamondManagerFacet = DiamondManagerFacet(address(diamond)); + miningPassFacet = MiningPassFacet(address(diamond)); + + diamondManagerFacet.setCurrentSeasonId(1); + diamondManagerFacet.setSeasonEndTimestamp(1, block.timestamp + 30 days); + + vm.stopPrank(); + } + + // ═══════════════════════════════════════════════════════════════════ + // GETTER TESTS + // ═══════════════════════════════════════════════════════════════════ + + function test_GetBaseMiningPassTierFee() public { + for (uint256 i; i < 11; i++) { + assertEq(diamondManagerFacet.getBaseMiningPassTierFee(i), originalFees[i]); + } + } + + function test_GetMiningPassTierFee() public { + // Initially, current fees should equal base fees + for (uint256 i; i < 11; i++) { + assertEq(diamondManagerFacet.getMiningPassTierFee(i), originalFees[i]); + } + } + + function test_GetMiningPassFeeFloorBps() public { + // Default floor is 25% = 2500 bps + assertEq(diamondManagerFacet.getMiningPassFeeFloorBps(), 2500); + } + + function test_GetMiningPassTierFloorFee() public { + // Floor fee = baseFee * 25% = baseFee / 4 + assertEq(diamondManagerFacet.getMiningPassTierFloorFee(0), 0); + assertEq(diamondManagerFacet.getMiningPassTierFloorFee(1), 0.125 * 1e6); // 0.5 * 0.25 + assertEq(diamondManagerFacet.getMiningPassTierFloorFee(5), 2 * 1e6); // 8 * 0.25 + assertEq(diamondManagerFacet.getMiningPassTierFloorFee(10), 25 * 1e6); // 100 * 0.25 + } + + function test_GetAllMiningPassFees() public { + uint256[] memory fees = diamondManagerFacet.getAllMiningPassFees(); + assertEq(fees.length, 11); + for (uint256 i; i < 11; i++) { + assertEq(fees[i], originalFees[i]); + } + } + + function test_GetMiningPassTierDepositLimit() public { + assertEq(diamondManagerFacet.getMiningPassTierDepositLimit(0), 5_000 * 1e18); + assertEq(diamondManagerFacet.getMiningPassTierDepositLimit(1), 10_000 * 1e18); + assertEq(diamondManagerFacet.getMiningPassTierDepositLimit(10), type(uint256).max); + } + + // ═══════════════════════════════════════════════════════════════════ + // SET FEES TESTS + // ═══════════════════════════════════════════════════════════════════ + + function test_SetMiningPassFees() public { + vm.startPrank(owner); + + // Simulate dynamic pricing: fees at 50% of original (above 25% floor) + uint256[] memory newFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + newFees[i] = originalFees[i] / 2; // 50% of original + } + + diamondManagerFacet.setMiningPassFees(newFees); + + // Verify fees were updated + for (uint256 i; i < 11; i++) { + assertEq(diamondManagerFacet.getMiningPassTierFee(i), newFees[i]); + } + + // Base fees should remain unchanged + for (uint256 i; i < 11; i++) { + assertEq(diamondManagerFacet.getBaseMiningPassTierFee(i), originalFees[i]); + } + + vm.stopPrank(); + } + + function test_SetMiningPassFees_AtFloor() public { + vm.startPrank(owner); + + // Set fees exactly at floor (25% of original) + uint256[] memory floorFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + floorFees[i] = (originalFees[i] * 2500) / 10000; // 25% of original + } + + diamondManagerFacet.setMiningPassFees(floorFees); + + for (uint256 i; i < 11; i++) { + assertEq(diamondManagerFacet.getMiningPassTierFee(i), floorFees[i]); + } + + vm.stopPrank(); + } + + function test_SetMiningPassFees_RevertIf_BelowFloor() public { + vm.startPrank(owner); + + // Try to set fees below floor (24% of original) + uint256[] memory lowFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + lowFees[i] = (originalFees[i] * 2400) / 10000; // 24% of original + } + + vm.expectRevert(DiamondManagerFacet__FeeBelowFloor.selector); + diamondManagerFacet.setMiningPassFees(lowFees); + + vm.stopPrank(); + } + + function test_SetMiningPassFees_RevertIf_InvalidLength() public { + vm.startPrank(owner); + + uint256[] memory shortFees = new uint256[](5); + + vm.expectRevert(DiamondManagerFacet__Invalid_Input.selector); + diamondManagerFacet.setMiningPassFees(shortFees); + + vm.stopPrank(); + } + + function test_SetMiningPassFees_RevertIf_NotOwner() public { + vm.startPrank(user); + + uint256[] memory newFees = new uint256[](11); + + vm.expectRevert(DiamondManagerFacet__Not_Owner.selector); + diamondManagerFacet.setMiningPassFees(newFees); + + vm.stopPrank(); + } + + // ═══════════════════════════════════════════════════════════════════ + // SET SINGLE TIER FEE TESTS + // ═══════════════════════════════════════════════════════════════════ + + function test_SetMiningPassTierFee() public { + vm.startPrank(owner); + + // Update tier 5 to 50% of original + uint256 newFee = originalFees[5] / 2; // $4 instead of $8 + diamondManagerFacet.setMiningPassTierFee(5, newFee); + + assertEq(diamondManagerFacet.getMiningPassTierFee(5), newFee); + // Other tiers unchanged + assertEq(diamondManagerFacet.getMiningPassTierFee(4), originalFees[4]); + assertEq(diamondManagerFacet.getMiningPassTierFee(6), originalFees[6]); + + vm.stopPrank(); + } + + function test_SetMiningPassTierFee_RevertIf_BelowFloor() public { + vm.startPrank(owner); + + // Try to set tier 5 below floor + uint256 belowFloorFee = 1.9 * 1e6; // Below $2 floor (25% of $8) + + vm.expectRevert(DiamondManagerFacet__FeeBelowFloor.selector); + diamondManagerFacet.setMiningPassTierFee(5, belowFloorFee); + + vm.stopPrank(); + } + + function test_SetMiningPassTierFee_RevertIf_InvalidTier() public { + vm.startPrank(owner); + + vm.expectRevert(DiamondManagerFacet__InvalidTier.selector); + diamondManagerFacet.setMiningPassTierFee(11, 1e6); + + vm.stopPrank(); + } + + // ═══════════════════════════════════════════════════════════════════ + // SET FLOOR TESTS + // ═══════════════════════════════════════════════════════════════════ + + function test_SetMiningPassFeeFloor() public { + vm.startPrank(owner); + + // Change floor to 50% + diamondManagerFacet.setMiningPassFeeFloor(5000); + assertEq(diamondManagerFacet.getMiningPassFeeFloorBps(), 5000); + + // Verify floor fee calculation changed + assertEq(diamondManagerFacet.getMiningPassTierFloorFee(10), 50 * 1e6); // 50% of $100 + + vm.stopPrank(); + } + + function test_SetMiningPassFeeFloor_RevertIf_InvalidValue() public { + vm.startPrank(owner); + + // Cannot exceed 100% + vm.expectRevert(DiamondManagerFacet__Invalid_Input.selector); + diamondManagerFacet.setMiningPassFeeFloor(10001); + + vm.stopPrank(); + } + + // ═══════════════════════════════════════════════════════════════════ + // PURCHASE WITH DYNAMIC FEES TESTS + // ═══════════════════════════════════════════════════════════════════ + + function test_Purchase_WithDynamicFees() public { + vm.startPrank(owner); + + // Set fees to 50% of original + uint256[] memory newFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + newFees[i] = originalFees[i] / 2; + } + diamondManagerFacet.setMiningPassFees(newFees); + + vm.stopPrank(); + + vm.startPrank(user); + _approveAndMintFeeToken(100 * 1e6); + + // Purchase tier 1 - should cost $0.25 instead of $0.50 + miningPassFacet.purchase(1); + + (uint256 _passTier,) = miningPassFacet.miningPassOf(user); + assertEq(_passTier, 1); + assertEq(feeToken.balanceOf(address(diamond)), 0.25 * 1e6); + + vm.stopPrank(); + } + + function test_Purchase_WithDynamicFees_Upgrade() public { + vm.startPrank(owner); + + // Set fees to 50% of original + uint256[] memory newFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + newFees[i] = originalFees[i] / 2; + } + diamondManagerFacet.setMiningPassFees(newFees); + + vm.stopPrank(); + + vm.startPrank(user); + _approveAndMintFeeToken(100 * 1e6); + + // Purchase tier 1 then upgrade to tier 2 + miningPassFacet.purchase(1); + miningPassFacet.purchase(2); + + (uint256 _passTier,) = miningPassFacet.miningPassOf(user); + assertEq(_passTier, 2); + + // Total paid: $0.25 (tier 1) + $0.25 (upgrade to tier 2) = $0.50 + assertEq(feeToken.balanceOf(address(diamond)), 0.5 * 1e6); + + vm.stopPrank(); + } + + function test_Purchase_AtFloorPrice() public { + vm.startPrank(owner); + + // Set fees at floor (25% of original) + uint256[] memory floorFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + floorFees[i] = (originalFees[i] * 2500) / 10000; + } + diamondManagerFacet.setMiningPassFees(floorFees); + + vm.stopPrank(); + + vm.startPrank(user); + _approveAndMintFeeToken(100 * 1e6); + + // Purchase tier 10 at floor price - should cost $25 instead of $100 + miningPassFacet.purchase(10); + + (uint256 _passTier,) = miningPassFacet.miningPassOf(user); + assertEq(_passTier, 10); + assertEq(feeToken.balanceOf(address(diamond)), 25 * 1e6); + + vm.stopPrank(); + } + + // ═══════════════════════════════════════════════════════════════════ + // DYNAMIC PRICING SIMULATION + // ═══════════════════════════════════════════════════════════════════ + + function test_DynamicPricing_SimulateVAPEPriceChange() public { + vm.startPrank(owner); + + // Simulate VAPE price drop: $0.606 -> $0.16 (26.4% of original) + // Formula: newFee = originalFee * (currentVAPEPrice / referenceVAPEPrice) + // At floor (25%), fees would be capped + + uint256 referenceVAPEPrice = 606; // $0.606 scaled by 1000 + uint256 currentVAPEPrice = 160; // $0.16 scaled by 1000 + + uint256[] memory dynamicFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + uint256 calculatedFee = (originalFees[i] * currentVAPEPrice) / referenceVAPEPrice; + uint256 floorFee = (originalFees[i] * 2500) / 10000; + // Apply floor + dynamicFees[i] = calculatedFee > floorFee ? calculatedFee : floorFee; + } + + diamondManagerFacet.setMiningPassFees(dynamicFees); + + // Verify tier 10: (100 * 1e6 * 160) / 606 = 26402640 (integer division) + // This is above floor (25 * 1e6), so dynamic price applies + uint256 expectedTier10Fee = (100 * 1e6 * currentVAPEPrice) / referenceVAPEPrice; + assertEq(diamondManagerFacet.getMiningPassTierFee(10), expectedTier10Fee); + assertTrue(expectedTier10Fee > 25 * 1e6, "Fee should be above floor"); + + vm.stopPrank(); + } + + function test_DynamicPricing_FloorProtection() public { + vm.startPrank(owner); + + // Simulate extreme VAPE price drop: $0.606 -> $0.10 (16.5% of original) + // This is below floor (25%), so fees should be capped at floor + + uint256 referenceVAPEPrice = 606; + uint256 currentVAPEPrice = 100; // $0.10 + + uint256[] memory dynamicFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + uint256 calculatedFee = (originalFees[i] * currentVAPEPrice) / referenceVAPEPrice; + uint256 floorFee = (originalFees[i] * 2500) / 10000; + // Apply floor + dynamicFees[i] = calculatedFee > floorFee ? calculatedFee : floorFee; + } + + diamondManagerFacet.setMiningPassFees(dynamicFees); + + // All fees should be at floor (25% of original) + assertEq(diamondManagerFacet.getMiningPassTierFee(10), 25 * 1e6); // Floor: $25 + + vm.stopPrank(); + } + + // ═══════════════════════════════════════════════════════════════════ + // HELPERS + // ═══════════════════════════════════════════════════════════════════ + + function _approveAndMintFeeToken(uint256 _amount) internal { + feeToken.mint(user, _amount); + feeToken.increaseAllowance(address(miningPassFacet), _amount); + } +} diff --git a/test/foundry/utils/DiamondTest.sol b/test/foundry/utils/DiamondTest.sol index df06cfa..5ff37df 100644 --- a/test/foundry/utils/DiamondTest.sol +++ b/test/foundry/utils/DiamondTest.sol @@ -19,8 +19,8 @@ import "src/facets/WithdrawFacet.sol"; import "src/facets/FeeCollectorFacet.sol"; import "src/facets/MiningPassFacet.sol"; import "src/upgradeInitializers/DiamondInit.sol"; -import { ERC20Mock } from "test/foundry/mocks/ERC20Mock.sol"; -import { StratosphereMock } from "test/foundry/mocks/StratosphereMock.sol"; +import {ERC20Mock} from "test/foundry/mocks/ERC20Mock.sol"; +import {StratosphereMock} from "test/foundry/mocks/StratosphereMock.sol"; contract DiamondTest is Test { IDiamondCut.FacetCut[] internal cut; @@ -178,7 +178,7 @@ contract DiamondTest is Test { function setDiamondManagerFacet() private { DiamondManagerFacet diamondManager = new DiamondManagerFacet(); bytes4[] memory functionSelectors; - functionSelectors = new bytes4[](29); + functionSelectors = new bytes4[](38); functionSelectors[0] = diamondManager.setDepositToken.selector; functionSelectors[1] = diamondManager.setCurrentSeasonId.selector; functionSelectors[2] = diamondManager.setStratosphereAddress.selector; @@ -208,6 +208,16 @@ contract DiamondTest is Test { functionSelectors[26] = diamondManager.setBoostFeeReceivers.selector; functionSelectors[27] = diamondManager.setUnlockFeeReceivers.selector; functionSelectors[28] = diamondManager.getUserLastBoostClaimedAmount.selector; + // Mining pass dynamic pricing + functionSelectors[29] = diamondManager.setMiningPassFees.selector; + functionSelectors[30] = diamondManager.setMiningPassTierFee.selector; + functionSelectors[31] = diamondManager.setMiningPassFeeFloor.selector; + functionSelectors[32] = diamondManager.getMiningPassTierFee.selector; + functionSelectors[33] = diamondManager.getBaseMiningPassTierFee.selector; + functionSelectors[34] = diamondManager.getMiningPassTierFloorFee.selector; + functionSelectors[35] = diamondManager.getMiningPassFeeFloorBps.selector; + functionSelectors[36] = diamondManager.getAllMiningPassFees.selector; + functionSelectors[37] = diamondManager.getMiningPassTierDepositLimit.selector; cut.push( IDiamondCut.FacetCut({ diff --git a/yarn.lock b/yarn.lock index 6ef8483..979ad56 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,11 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz#60111a5d9db45b2e5cbb6231b0bb8d97e8659316" integrity sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg== +"@adraffy/ens-normalize@^1.11.0": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz#6c2d657d4b2dfb37f8ea811dcb3e60843d4ac24a" + integrity sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ== + "@babel/code-frame@^7.0.0": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" @@ -447,6 +452,11 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@noble/ciphers@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-1.3.0.tgz#f64b8ff886c240e644e5573c097f86e5b43676dc" + integrity sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw== + "@noble/curves@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" @@ -454,6 +464,20 @@ dependencies: "@noble/hashes" "1.3.2" +"@noble/curves@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.1.tgz#9654a0bc6c13420ae252ddcf975eaf0f58f0a35c" + integrity sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA== + dependencies: + "@noble/hashes" "1.8.0" + +"@noble/curves@~1.9.0": + version "1.9.7" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.7.tgz#79d04b4758a43e4bca2cbdc62e7771352fa6b951" + integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw== + dependencies: + "@noble/hashes" "1.8.0" + "@noble/hashes@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" @@ -469,6 +493,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== +"@noble/hashes@1.8.0", "@noble/hashes@^1.8.0", "@noble/hashes@~1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" + integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== + "@noble/hashes@^1.3.3": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" @@ -791,6 +820,11 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== +"@scure/base@~1.2.5": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6" + integrity sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg== + "@scure/bip32@1.1.5": version "1.1.5" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" @@ -800,6 +834,15 @@ "@noble/secp256k1" "~1.7.0" "@scure/base" "~1.1.0" +"@scure/bip32@1.7.0", "@scure/bip32@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.7.0.tgz#b8683bab172369f988f1589640e53c4606984219" + integrity sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw== + dependencies: + "@noble/curves" "~1.9.0" + "@noble/hashes" "~1.8.0" + "@scure/base" "~1.2.5" + "@scure/bip39@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" @@ -808,6 +851,14 @@ "@noble/hashes" "~1.2.0" "@scure/base" "~1.1.0" +"@scure/bip39@1.6.0", "@scure/bip39@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.6.0.tgz#475970ace440d7be87a6086cbee77cb8f1a684f9" + integrity sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A== + dependencies: + "@noble/hashes" "~1.8.0" + "@scure/base" "~1.2.5" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -1072,6 +1123,11 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== +abitype@1.2.3, abitype@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.2.3.tgz#bec3e09dea97d99ef6c719140bee663a329ad1f4" + integrity sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg== + abitype@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" @@ -2450,6 +2506,11 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +eventemitter3@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -3516,6 +3577,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isows@1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.7.tgz#1c06400b7eed216fbba3bcbd68f12490fc342915" + integrity sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -4271,6 +4337,20 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +ox@0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/ox/-/ox-0.11.3.tgz#f50be1cae88822f5111b1e3f4a324c4c07eed422" + integrity sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw== + dependencies: + "@adraffy/ens-normalize" "^1.11.0" + "@noble/ciphers" "^1.3.0" + "@noble/curves" "1.9.1" + "@noble/hashes" "^1.8.0" + "@scure/bip32" "^1.7.0" + "@scure/bip39" "^1.6.0" + abitype "^1.2.3" + eventemitter3 "5.0.1" + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -5613,6 +5693,20 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +viem@2.45.1: + version "2.45.1" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.45.1.tgz#c1c373efcf2a0b30f5e454cfb4a9c18ac5bb5452" + integrity sha512-LN6Pp7vSfv50LgwhkfSbIXftAM5J89lP9x8TeDa8QM7o41IxlHrDh0F9X+FfnCWtsz11pEVV5sn+yBUoOHNqYA== + dependencies: + "@noble/curves" "1.9.1" + "@noble/hashes" "1.8.0" + "@scure/bip32" "1.7.0" + "@scure/bip39" "1.6.0" + abitype "1.2.3" + isows "1.0.7" + ox "0.11.3" + ws "8.18.3" + web3-utils@^1.3.6: version "1.10.0" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" @@ -5750,6 +5844,11 @@ ws@8.17.1: resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +ws@8.18.3: + version "8.18.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" + integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== + ws@8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" From 4622bf9178c9a0f5bd7e7c1b127c156e2e14ea88 Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Mon, 16 Feb 2026 23:00:50 +0530 Subject: [PATCH 2/7] fix: storage collision in fuji --- deployments/AuthorizationFacet.json | 8 +- deployments/BoostFacet.json | 10 +- deployments/ClaimFacet.json | 8 +- deployments/DepositFacet.json | 13 +- deployments/DiamondManagerFacet.json | 406 ++++++++++++++---- deployments/FeeCollectorFacet.json | 13 +- deployments/MiningPassFacet.json | 35 +- deployments/OwnershipFacet.json | 8 +- deployments/PausationFacet.json | 8 +- deployments/UnlockFacet.json | 6 +- deployments/WithdrawFacet.json | 6 +- hardhat.config.ts | 2 + scripts/initDynamicPricing.ts | 54 +++ src/facets/DiamondManagerFacet.sol | 20 + src/libraries/AppStorage.sol | 81 ++-- tasks/diamondInfo.ts | 163 +++++++ tasks/startSeason.ts | 134 ++++++ .../Facets/MiningPassDynamicPricing.t.sol | 53 +++ test/foundry/fork/FujiForkMiningPass.t.sol | 200 +++++++++ test/foundry/utils/DiamondTest.sol | 3 +- 20 files changed, 1067 insertions(+), 164 deletions(-) create mode 100644 scripts/initDynamicPricing.ts create mode 100644 tasks/diamondInfo.ts create mode 100644 tasks/startSeason.ts create mode 100644 test/foundry/fork/FujiForkMiningPass.t.sol diff --git a/deployments/AuthorizationFacet.json b/deployments/AuthorizationFacet.json index 804ca6c..af0394f 100644 --- a/deployments/AuthorizationFacet.json +++ b/deployments/AuthorizationFacet.json @@ -56,17 +56,17 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061024b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80633bbbc7c914610046578063b6a5d7de1461005b578063b91816111461006e575b600080fd5b6100596100543660046101d8565b6100bb565b005b6100596100693660046101d8565b61010f565b6100a761007c3660046101d8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b604051901515815260200160405180910390f35b6100c3610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610117610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101d6576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000602082840312156101ea57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020e57600080fd5b939250505056fea26469706673582212206954ab9119fc8a5f453dab97d517d060dbd2057b1ce9fdc4e29f59584dc0a74e64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633bbbc7c914610046578063b6a5d7de1461005b578063b91816111461006e575b600080fd5b6100596100543660046101d8565b6100bb565b005b6100596100693660046101d8565b61010f565b6100a761007c3660046101d8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b604051901515815260200160405180910390f35b6100c3610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610117610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101d6576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000602082840312156101ea57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020e57600080fd5b939250505056fea26469706673582212206954ab9119fc8a5f453dab97d517d060dbd2057b1ce9fdc4e29f59584dc0a74e64736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b5061024b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80633bbbc7c914610046578063b6a5d7de1461005b578063b91816111461006e575b600080fd5b6100596100543660046101d8565b6100bb565b005b6100596100693660046101d8565b61010f565b6100a761007c3660046101d8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b604051901515815260200160405180910390f35b6100c3610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610117610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101d6576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000602082840312156101ea57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020e57600080fd5b939250505056fea2646970667358221220e69d9fcd8693fd2077284a7845242557f17631c80d796b01e59d083d5fe481b664736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633bbbc7c914610046578063b6a5d7de1461005b578063b91816111461006e575b600080fd5b6100596100543660046101d8565b6100bb565b005b6100596100693660046101d8565b61010f565b6100a761007c3660046101d8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b604051901515815260200160405180910390f35b6100c3610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610117610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101d6576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000602082840312156101ea57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020e57600080fd5b939250505056fea2646970667358221220e69d9fcd8693fd2077284a7845242557f17631c80d796b01e59d083d5fe481b664736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, "options": { "args": [], "log": true, - "skipIfAlreadyDeployed": false + "skipIfAlreadyDeployed": true }, - "address": "0x0B88CA7B50aBb560A70c24c84Ff88d46Fd2634A2" + "address": "0xfd27E4e7730B8B636377974db80E9635b9583D3a" }, "hardhat": { "artifact": { diff --git a/deployments/BoostFacet.json b/deployments/BoostFacet.json index 8ac5936..8fee60c 100644 --- a/deployments/BoostFacet.json +++ b/deployments/BoostFacet.json @@ -72,7 +72,7 @@ "inputs": [ { "internalType": "uint256", - "name": "boostLevel", + "name": "_boostLevel", "type": "uint256" } ], @@ -82,17 +82,17 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061075c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063502d296714610030575b600080fd5b61004361003e3660046105d9565b610045565b005b60025460008181526005602090815260408083203384529091528120805490910361009c576040517f3a0d884600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004810154158015906100c05750620151808160040154426100be9190610621565b105b156100f7576040517f269eb72b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806101066000336102d4565b60ff16915091508115801561011b5750600086115b15610152576040517f3055f2cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b811561016a576000868152600f602052604090205492505b426004850155600082156101985750600081815260106020908152604080832089845290915290205461019d565b50600e545b60006101aa868389610419565b9050808660030160008282546101c09190610634565b909155505060058601819055841561027e576101db856104bc565b601b546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810187905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af1158015610258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027c9190610647565b505b604080518981526020810183905290810186905260608101849052339088907fd3a080433deb263ff167dc354e7f90486543d360ea1e03ff1264490f3429ffef9060800160405180910390a35050505050505050565b601c8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561034e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103729190610669565b90508015610410576040517f53f96df2000000000000000000000000000000000000000000000000000000008152600481018290526001945073ffffffffffffffffffffffffffffffffffffffff8316906353f96df290602401602060405180830381865afa1580156103e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040d9190610682565b92505b50509250929050565b60008260000361042b575060006104b5565b600082815260046020526040812060028101549091906201518090610451904290610621565b61045b91906106a5565b905080600003610470576000925050506104b5565b85546000906104809083906106e0565b876002015461048f9190610621565b9050806000036104a557600093505050506104b5565b6104af81876105b7565b93505050505b9392505050565b601180546012805490919081146104ff576040517f44e29d8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156105b057600061053286858481548110610522576105226106f7565b90600052602060002001546105b7565b9050806000601601600087858154811061054e5761054e6106f7565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220601b54909416825292909252812080549091906105a2908490610634565b909155505050600101610502565b5050505050565b60006127106105c683856106e0565b6105d091906106a5565b90505b92915050565b6000602082840312156105eb57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105d3576105d36105f2565b808201808211156105d3576105d36105f2565b60006020828403121561065957600080fd5b815180151581146104b557600080fd5b60006020828403121561067b57600080fd5b5051919050565b60006020828403121561069457600080fd5b815160ff811681146104b557600080fd5b6000826106db577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176105d3576105d36105f2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212202b54a505a8ba39762f11fea82f1fa07b296dc8e0f45dc083bf3074ffc3e8923e64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063502d296714610030575b600080fd5b61004361003e3660046105d9565b610045565b005b60025460008181526005602090815260408083203384529091528120805490910361009c576040517f3a0d884600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004810154158015906100c05750620151808160040154426100be9190610621565b105b156100f7576040517f269eb72b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806101066000336102d4565b60ff16915091508115801561011b5750600086115b15610152576040517f3055f2cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b811561016a576000868152600f602052604090205492505b426004850155600082156101985750600081815260106020908152604080832089845290915290205461019d565b50600e545b60006101aa868389610419565b9050808660030160008282546101c09190610634565b909155505060058601819055841561027e576101db856104bc565b601b546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810187905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af1158015610258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027c9190610647565b505b604080518981526020810183905290810186905260608101849052339088907fd3a080433deb263ff167dc354e7f90486543d360ea1e03ff1264490f3429ffef9060800160405180910390a35050505050505050565b601c8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561034e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103729190610669565b90508015610410576040517f53f96df2000000000000000000000000000000000000000000000000000000008152600481018290526001945073ffffffffffffffffffffffffffffffffffffffff8316906353f96df290602401602060405180830381865afa1580156103e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040d9190610682565b92505b50509250929050565b60008260000361042b575060006104b5565b600082815260046020526040812060028101549091906201518090610451904290610621565b61045b91906106a5565b905080600003610470576000925050506104b5565b85546000906104809083906106e0565b876002015461048f9190610621565b9050806000036104a557600093505050506104b5565b6104af81876105b7565b93505050505b9392505050565b601180546012805490919081146104ff576040517f44e29d8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156105b057600061053286858481548110610522576105226106f7565b90600052602060002001546105b7565b9050806000601601600087858154811061054e5761054e6106f7565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220601b54909416825292909252812080549091906105a2908490610634565b909155505050600101610502565b5050505050565b60006127106105c683856106e0565b6105d091906106a5565b90505b92915050565b6000602082840312156105eb57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105d3576105d36105f2565b808201808211156105d3576105d36105f2565b60006020828403121561065957600080fd5b815180151581146104b557600080fd5b60006020828403121561067b57600080fd5b5051919050565b60006020828403121561069457600080fd5b815160ff811681146104b557600080fd5b6000826106db577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176105d3576105d36105f2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212202b54a505a8ba39762f11fea82f1fa07b296dc8e0f45dc083bf3074ffc3e8923e64736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b506106fc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063502d296714610030575b600080fd5b61004361003e36600461059c565b610045565b005b60025460008181526005602090815260408083203384529091528120805490910361009c576040517f3a0d884600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004810154158015906100c05750620151808160040154426100be91906105e4565b105b156100f7576040517f269eb72b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610105600033610266565b60ff16915091506000610118838761031e565b4260048601559050600061012d848489610386565b9050600061013c8683896103ba565b90508086600301600082825461015291906105f7565b90915550506005860181905582156102105761016d83610488565b6019546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af11580156101ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020e919061060a565b505b604080518981526020810183905290810184905260608101859052339088907fd3a080433deb263ff167dc354e7f90486543d360ea1e03ff1264490f3429ffef9060800160405180910390a35050505050505050565b601a8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa1580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610304919061062c565b905080156103155760019350600092505b50509250929050565b6000821561033b57506000818152600c6020526040902054610380565b821580156103495750600082115b15610380576040517f3055f2cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b600083156103ae57506000828152600d602090815260408083208484529091529020546103b3565b50600b545b9392505050565b6000826000036103cc575060006103b3565b6000828152600460205260408120600281015490919062015180906103f29042906105e4565b6103fc9190610645565b905080600003610411576000925050506103b3565b8554600090610421908390610680565b8760030154886002015461043591906105f7565b61043f91906105e4565b90508060000361045557600093505050506103b3565b60006104618288610583565b90508084600701600082825461047791906105f7565b909155509098975050505050505050565b600e8054600f805490919081146104cb576040517f44e29d8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561057c5760006104fe868584815481106104ee576104ee610697565b9060005260206000200154610583565b9050806000601001600087858154811061051a5761051a610697565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182206019549094168252929092528120805490919061056e9084906105f7565b9091555050506001016104ce565b5050505050565b60006127106105928385610680565b6103b39190610645565b6000602082840312156105ae57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610380576103806105b5565b80820180821115610380576103806105b5565b60006020828403121561061c57600080fd5b815180151581146103b357600080fd5b60006020828403121561063e57600080fd5b5051919050565b60008261067b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610380576103806105b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220316babebf3d79b80a3c96e3cac17864ac7ec9a492f0315c3d77f5b194a0e443064736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063502d296714610030575b600080fd5b61004361003e36600461059c565b610045565b005b60025460008181526005602090815260408083203384529091528120805490910361009c576040517f3a0d884600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004810154158015906100c05750620151808160040154426100be91906105e4565b105b156100f7576040517f269eb72b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610105600033610266565b60ff16915091506000610118838761031e565b4260048601559050600061012d848489610386565b9050600061013c8683896103ba565b90508086600301600082825461015291906105f7565b90915550506005860181905582156102105761016d83610488565b6019546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af11580156101ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020e919061060a565b505b604080518981526020810183905290810184905260608101859052339088907fd3a080433deb263ff167dc354e7f90486543d360ea1e03ff1264490f3429ffef9060800160405180910390a35050505050505050565b601a8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa1580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610304919061062c565b905080156103155760019350600092505b50509250929050565b6000821561033b57506000818152600c6020526040902054610380565b821580156103495750600082115b15610380576040517f3055f2cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b600083156103ae57506000828152600d602090815260408083208484529091529020546103b3565b50600b545b9392505050565b6000826000036103cc575060006103b3565b6000828152600460205260408120600281015490919062015180906103f29042906105e4565b6103fc9190610645565b905080600003610411576000925050506103b3565b8554600090610421908390610680565b8760030154886002015461043591906105f7565b61043f91906105e4565b90508060000361045557600093505050506103b3565b60006104618288610583565b90508084600701600082825461047791906105f7565b909155509098975050505050505050565b600e8054600f805490919081146104cb576040517f44e29d8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561057c5760006104fe868584815481106104ee576104ee610697565b9060005260206000200154610583565b9050806000601001600087858154811061051a5761051a610697565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182206019549094168252929092528120805490919061056e9084906105f7565b9091555050506001016104ce565b5050505050565b60006127106105928385610680565b6103b39190610645565b6000602082840312156105ae57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610380576103806105b5565b80820180821115610380576103806105b5565b60006020828403121561061c57600080fd5b815180151581146103b357600080fd5b60006020828403121561063e57600080fd5b5051919050565b60008261067b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610380576103806105b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220316babebf3d79b80a3c96e3cac17864ac7ec9a492f0315c3d77f5b194a0e443064736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, "options": { "args": [], "log": true, - "skipIfAlreadyDeployed": false + "skipIfAlreadyDeployed": true }, - "address": "0xa6781ae4Ea2E3fCe3f78d6e1198D2F3d79fCE831" + "address": "0x536BECeD986BD133Be29b1914A754388ac62B375" }, "hardhat": { "artifact": { diff --git a/deployments/ClaimFacet.json b/deployments/ClaimFacet.json index c0c3aad..0119aa8 100644 --- a/deployments/ClaimFacet.json +++ b/deployments/ClaimFacet.json @@ -93,17 +93,17 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610a71806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806316890b2a1461003b57806359dff49414610050575b600080fd5b61004e6100493660046107f9565b610063565b005b61004e61005e366004610854565b6103c4565b61006e600033610710565b6000828152600460205260409020600281015442116100b9576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120600281015460068201549192909190829003610130576040517f4f231d2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088301541561016c576040517f3f943e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600301548361017e9190610972565b9050600061018c8287610773565b9050600061019a82886107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048901805492935083929091906101f7908490610985565b92505081905550808760060160008282546102129190610972565b9091555050601a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b49190610998565b5085546000906102c5908690610972565b6019546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015610340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103649190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8b16918c917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350505050505050505050565b6103cf600033610710565b60008281526004602052604090206002810154421161041a576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160005b8181101561070957600084828151811061043b5761043b6109ba565b602090810291909101810151600088815260058352604080822073ffffffffffffffffffffffffffffffffffffffff84168352909352918220600281015460068201549294509092909190829003610496575050505061041f565b6008830154156104a9575050505061041f565b60008360030154836104bb9190610972565b905060006104c9828a610773565b905060006104d7828b6107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048c0180549293508392909190610534908490610985565b92505081905550808a600601600082825461054f9190610972565b9091555050601a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156105cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f19190610998565b508554600090610602908690610972565b6019546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af115801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8a16918f917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350506001909601955061041f945050505050565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff1661076f576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6007810154600090818161078f86670de0b6b3a76400006109e9565b6107999190610a00565b925050505b92915050565b6000670de0b6b3a76400008383600301546107bf91906109e9565b6107c99190610a00565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f457600080fd5b919050565b6000806040838503121561080c57600080fd5b8235915061081c602084016107d0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561086757600080fd5b8235915060208084013567ffffffffffffffff8082111561088757600080fd5b818601915086601f83011261089b57600080fd5b8135818111156108ad576108ad610825565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156108f0576108f0610825565b60405291825284820192508381018501918983111561090e57600080fd5b938501935b8285101561093357610924856107d0565b84529385019392850192610913565b8096505050505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079e5761079e610943565b8181038181111561079e5761079e610943565b6000602082840312156109aa57600080fd5b815180151581146107c957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808202811582820484141761079e5761079e610943565b600082610a36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220e396becb510c318f885d10710b6056aad850051dc5552e85dca360c145c977c964736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806316890b2a1461003b57806359dff49414610050575b600080fd5b61004e6100493660046107f9565b610063565b005b61004e61005e366004610854565b6103c4565b61006e600033610710565b6000828152600460205260409020600281015442116100b9576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120600281015460068201549192909190829003610130576040517f4f231d2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088301541561016c576040517f3f943e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600301548361017e9190610972565b9050600061018c8287610773565b9050600061019a82886107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048901805492935083929091906101f7908490610985565b92505081905550808760060160008282546102129190610972565b9091555050601a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b49190610998565b5085546000906102c5908690610972565b6019546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015610340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103649190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8b16918c917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350505050505050505050565b6103cf600033610710565b60008281526004602052604090206002810154421161041a576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160005b8181101561070957600084828151811061043b5761043b6109ba565b602090810291909101810151600088815260058352604080822073ffffffffffffffffffffffffffffffffffffffff84168352909352918220600281015460068201549294509092909190829003610496575050505061041f565b6008830154156104a9575050505061041f565b60008360030154836104bb9190610972565b905060006104c9828a610773565b905060006104d7828b6107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048c0180549293508392909190610534908490610985565b92505081905550808a600601600082825461054f9190610972565b9091555050601a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156105cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f19190610998565b508554600090610602908690610972565b6019546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af115801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8a16918f917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350506001909601955061041f945050505050565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff1661076f576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6007810154600090818161078f86670de0b6b3a76400006109e9565b6107999190610a00565b925050505b92915050565b6000670de0b6b3a76400008383600301546107bf91906109e9565b6107c99190610a00565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f457600080fd5b919050565b6000806040838503121561080c57600080fd5b8235915061081c602084016107d0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561086757600080fd5b8235915060208084013567ffffffffffffffff8082111561088757600080fd5b818601915086601f83011261089b57600080fd5b8135818111156108ad576108ad610825565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156108f0576108f0610825565b60405291825284820192508381018501918983111561090e57600080fd5b938501935b8285101561093357610924856107d0565b84529385019392850192610913565b8096505050505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079e5761079e610943565b8181038181111561079e5761079e610943565b6000602082840312156109aa57600080fd5b815180151581146107c957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808202811582820484141761079e5761079e610943565b600082610a36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220e396becb510c318f885d10710b6056aad850051dc5552e85dca360c145c977c964736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b50610a71806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806316890b2a1461003b57806359dff49414610050575b600080fd5b61004e6100493660046107f9565b610063565b005b61004e61005e366004610854565b6103c4565b61006e600033610710565b6000828152600460205260409020600281015442116100b9576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120600281015460068201549192909190829003610130576040517f4f231d2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088301541561016c576040517f3f943e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600301548361017e9190610972565b9050600061018c8287610773565b9050600061019a82886107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048901805492935083929091906101f7908490610985565b92505081905550808760060160008282546102129190610972565b90915550506018546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b49190610998565b5085546000906102c5908690610972565b6017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015610340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103649190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8b16918c917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350505050505050505050565b6103cf600033610710565b60008281526004602052604090206002810154421161041a576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160005b8181101561070957600084828151811061043b5761043b6109ba565b602090810291909101810151600088815260058352604080822073ffffffffffffffffffffffffffffffffffffffff84168352909352918220600281015460068201549294509092909190829003610496575050505061041f565b6008830154156104a9575050505061041f565b60008360030154836104bb9190610972565b905060006104c9828a610773565b905060006104d7828b6107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048c0180549293508392909190610534908490610985565b92505081905550808a600601600082825461054f9190610972565b90915550506018546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156105cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f19190610998565b508554600090610602908690610972565b6017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af115801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8a16918f917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350506001909601955061041f945050505050565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff1661076f576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6007810154600090818161078f86670de0b6b3a76400006109e9565b6107999190610a00565b925050505b92915050565b6000670de0b6b3a76400008383600301546107bf91906109e9565b6107c99190610a00565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f457600080fd5b919050565b6000806040838503121561080c57600080fd5b8235915061081c602084016107d0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561086757600080fd5b8235915060208084013567ffffffffffffffff8082111561088757600080fd5b818601915086601f83011261089b57600080fd5b8135818111156108ad576108ad610825565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156108f0576108f0610825565b60405291825284820192508381018501918983111561090e57600080fd5b938501935b8285101561093357610924856107d0565b84529385019392850192610913565b8096505050505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079e5761079e610943565b8181038181111561079e5761079e610943565b6000602082840312156109aa57600080fd5b815180151581146107c957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808202811582820484141761079e5761079e610943565b600082610a36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220da59b4c12674f0b8d1bd46712009a318fb17ec59602f240f461eb3c41e6ebc9564736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806316890b2a1461003b57806359dff49414610050575b600080fd5b61004e6100493660046107f9565b610063565b005b61004e61005e366004610854565b6103c4565b61006e600033610710565b6000828152600460205260409020600281015442116100b9576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120600281015460068201549192909190829003610130576040517f4f231d2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088301541561016c576040517f3f943e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600301548361017e9190610972565b9050600061018c8287610773565b9050600061019a82886107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048901805492935083929091906101f7908490610985565b92505081905550808760060160008282546102129190610972565b90915550506018546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b49190610998565b5085546000906102c5908690610972565b6017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015610340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103649190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8b16918c917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350505050505050505050565b6103cf600033610710565b60008281526004602052604090206002810154421161041a576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160005b8181101561070957600084828151811061043b5761043b6109ba565b602090810291909101810151600088815260058352604080822073ffffffffffffffffffffffffffffffffffffffff84168352909352918220600281015460068201549294509092909190829003610496575050505061041f565b6008830154156104a9575050505061041f565b60008360030154836104bb9190610972565b905060006104c9828a610773565b905060006104d7828b6107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048c0180549293508392909190610534908490610985565b92505081905550808a600601600082825461054f9190610972565b90915550506018546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156105cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f19190610998565b508554600090610602908690610972565b6017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af115801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8a16918f917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350506001909601955061041f945050505050565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff1661076f576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6007810154600090818161078f86670de0b6b3a76400006109e9565b6107999190610a00565b925050505b92915050565b6000670de0b6b3a76400008383600301546107bf91906109e9565b6107c99190610a00565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f457600080fd5b919050565b6000806040838503121561080c57600080fd5b8235915061081c602084016107d0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561086757600080fd5b8235915060208084013567ffffffffffffffff8082111561088757600080fd5b818601915086601f83011261089b57600080fd5b8135818111156108ad576108ad610825565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156108f0576108f0610825565b60405291825284820192508381018501918983111561090e57600080fd5b938501935b8285101561093357610924856107d0565b84529385019392850192610913565b8096505050505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079e5761079e610943565b8181038181111561079e5761079e610943565b6000602082840312156109aa57600080fd5b815180151581146107c957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808202811582820484141761079e5761079e610943565b600082610a36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220da59b4c12674f0b8d1bd46712009a318fb17ec59602f240f461eb3c41e6ebc9564736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, "options": { "args": [], "log": true, - "skipIfAlreadyDeployed": false + "skipIfAlreadyDeployed": true }, - "address": "0xbCE10F19C19151036E32Ae0087F51afAc24f3D5A" + "address": "0xc9068e2CfCA201717D5ACc1E990365600bAc919b" }, "hardhat": { "artifact": { diff --git a/deployments/DepositFacet.json b/deployments/DepositFacet.json index bc7d179..4a43c7e 100644 --- a/deployments/DepositFacet.json +++ b/deployments/DepositFacet.json @@ -10,6 +10,11 @@ "name": "DepositFacet__InvalidMiningPass", "type": "error" }, + { + "inputs": [], + "name": "DepositFacet__Less_Than_One_Day", + "type": "error" + }, { "inputs": [], "name": "DepositFacet__NotEnoughTokenBalance", @@ -64,17 +69,17 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610699806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b6b55f2514610030575b600080fd5b61004361003e366004610538565b610045565b005b601d54600203610081576040517f50bf8f2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002601d81905560195490546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9092169182906370a0823190602401602060405180830381865afa1580156100fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011e9190610551565b831115610157576040517f8dd4747600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600560209081526040808320338452825280832060098101548452601890925290912054815461018d908690610599565b11156101c5576040517fda9e267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000036101d5574260048201555b336000818152600b6020526040812084905590819081906101f7908290610304565b60ff169150915081156102165760008181526009602052604090205492505b610221878686610449565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810188905273ffffffffffffffffffffffffffffffffffffffff8716906323b872dd906064016020604051808303816000875af115801561029a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102be91906105b2565b50604051878152339086907feaa18152488ce5959073c9c79c88ca90b3d96c00de1f118cfaad664c3dab06b99060200160405180910390a350506001601d555050505050565b601c8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561037e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a29190610551565b90508015610440576040517f53f96df2000000000000000000000000000000000000000000000000000000008152600481018290526001945073ffffffffffffffffffffffffffffffffffffffff8316906353f96df290602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906105db565b92505b50509250929050565b60008281526004602052604090206002810154421115610495576040517f20c02df000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620151804283600201546104ab91906105fe565b6104b59190610611565b9050848360000160008282546104cb9190610599565b909155506104db9050818661064c565b8360020160008282546104ee9190610599565b92505081905550848260050160008282546105099190610599565b909155506105199050818661064c565b82600701600082825461052c9190610599565b90915550505050505050565b60006020828403121561054a57600080fd5b5035919050565b60006020828403121561056357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105ac576105ac61056a565b92915050565b6000602082840312156105c457600080fd5b815180151581146105d457600080fd5b9392505050565b6000602082840312156105ed57600080fd5b815160ff811681146105d457600080fd5b818103818111156105ac576105ac61056a565b600082610647577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176105ac576105ac61056a56fea2646970667358221220e78cdebd3a758342d53bb6925fb89bd5c78d7c014844b8cd64301774804df7e564736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b6b55f2514610030575b600080fd5b61004361003e366004610538565b610045565b005b601d54600203610081576040517f50bf8f2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002601d81905560195490546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9092169182906370a0823190602401602060405180830381865afa1580156100fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011e9190610551565b831115610157576040517f8dd4747600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600560209081526040808320338452825280832060098101548452601890925290912054815461018d908690610599565b11156101c5576040517fda9e267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000036101d5574260048201555b336000818152600b6020526040812084905590819081906101f7908290610304565b60ff169150915081156102165760008181526009602052604090205492505b610221878686610449565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810188905273ffffffffffffffffffffffffffffffffffffffff8716906323b872dd906064016020604051808303816000875af115801561029a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102be91906105b2565b50604051878152339086907feaa18152488ce5959073c9c79c88ca90b3d96c00de1f118cfaad664c3dab06b99060200160405180910390a350506001601d555050505050565b601c8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561037e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a29190610551565b90508015610440576040517f53f96df2000000000000000000000000000000000000000000000000000000008152600481018290526001945073ffffffffffffffffffffffffffffffffffffffff8316906353f96df290602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906105db565b92505b50509250929050565b60008281526004602052604090206002810154421115610495576040517f20c02df000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620151804283600201546104ab91906105fe565b6104b59190610611565b9050848360000160008282546104cb9190610599565b909155506104db9050818661064c565b8360020160008282546104ee9190610599565b92505081905550848260050160008282546105099190610599565b909155506105199050818661064c565b82600701600082825461052c9190610599565b90915550505050505050565b60006020828403121561054a57600080fd5b5035919050565b60006020828403121561056357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105ac576105ac61056a565b92915050565b6000602082840312156105c457600080fd5b815180151581146105d457600080fd5b9392505050565b6000602082840312156105ed57600080fd5b815160ff811681146105d457600080fd5b818103818111156105ac576105ac61056a565b600082610647577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176105ac576105ac61056a56fea2646970667358221220e78cdebd3a758342d53bb6925fb89bd5c78d7c014844b8cd64301774804df7e564736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b50610539806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b6b55f2514610030575b600080fd5b61004361003e3660046103fb565b610045565b005b601b54600203610081576040517f50bf8f2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002601b81905560175490546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9092169182906370a0823190602401602060405180830381865afa1580156100fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011e9190610414565b831115610157576040517f8dd4747600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600560209081526040808320338452825280832060098101548452601290925290912054815461018d90869061045c565b11156101c5576040517fda9e267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000036101d5574260048201555b3360009081526008602052604090208290556101f28483836102d2565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff8416906323b872dd906064016020604051808303816000875af115801561026b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028f9190610475565b50604051848152339083907feaa18152488ce5959073c9c79c88ca90b3d96c00de1f118cfaad664c3dab06b99060200160405180910390a350506001601b555050565b6000828152600460205260409020600281015442111561031e576040517f20c02df000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062015180428360020154610334919061049e565b61033e91906104b1565b90508060000361037a576040517f4086629900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8483600001600082825461038e919061045c565b9091555061039e905081866104ec565b8360020160008282546103b1919061045c565b92505081905550848260050160008282546103cc919061045c565b909155506103dc905081866104ec565b8260070160008282546103ef919061045c565b90915550505050505050565b60006020828403121561040d57600080fd5b5035919050565b60006020828403121561042657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561046f5761046f61042d565b92915050565b60006020828403121561048757600080fd5b8151801515811461049757600080fd5b9392505050565b8181038181111561046f5761046f61042d565b6000826104e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761046f5761046f61042d56fea2646970667358221220dd66ee540c1842bcce6c3ecbdb2ad13b5f82196a13c81cf4d7dd4bd9d6f83c6f64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b6b55f2514610030575b600080fd5b61004361003e3660046103fb565b610045565b005b601b54600203610081576040517f50bf8f2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002601b81905560175490546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9092169182906370a0823190602401602060405180830381865afa1580156100fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011e9190610414565b831115610157576040517f8dd4747600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600560209081526040808320338452825280832060098101548452601290925290912054815461018d90869061045c565b11156101c5576040517fda9e267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000036101d5574260048201555b3360009081526008602052604090208290556101f28483836102d2565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff8416906323b872dd906064016020604051808303816000875af115801561026b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028f9190610475565b50604051848152339083907feaa18152488ce5959073c9c79c88ca90b3d96c00de1f118cfaad664c3dab06b99060200160405180910390a350506001601b555050565b6000828152600460205260409020600281015442111561031e576040517f20c02df000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062015180428360020154610334919061049e565b61033e91906104b1565b90508060000361037a576040517f4086629900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8483600001600082825461038e919061045c565b9091555061039e905081866104ec565b8360020160008282546103b1919061045c565b92505081905550848260050160008282546103cc919061045c565b909155506103dc905081866104ec565b8260070160008282546103ef919061045c565b90915550505050505050565b60006020828403121561040d57600080fd5b5035919050565b60006020828403121561042657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561046f5761046f61042d565b92915050565b60006020828403121561048757600080fd5b8151801515811461049757600080fd5b9392505050565b8181038181111561046f5761046f61042d565b6000826104e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761046f5761046f61042d56fea2646970667358221220dd66ee540c1842bcce6c3ecbdb2ad13b5f82196a13c81cf4d7dd4bd9d6f83c6f64736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, "options": { "args": [], "log": true, - "skipIfAlreadyDeployed": false + "skipIfAlreadyDeployed": true }, - "address": "0xAdFc5fDE2f393aF1FD6476B306e65B9588233eC0" + "address": "0xf52265Beab3CcC21143a59926Fbd51528D9b70e8" }, "hardhat": { "artifact": { diff --git a/deployments/DiamondManagerFacet.json b/deployments/DiamondManagerFacet.json index 22c18ac..8e7a3b6 100644 --- a/deployments/DiamondManagerFacet.json +++ b/deployments/DiamondManagerFacet.json @@ -5,6 +5,21 @@ "contractName": "DiamondManagerFacet", "sourceName": "src/facets/DiamondManagerFacet.sol", "abi": [ + { + "inputs": [], + "name": "DiamondManagerFacet_InvalidArgs_ChangeBoostPoints", + "type": "error" + }, + { + "inputs": [], + "name": "DiamondManagerFacet__FeeBelowFloor", + "type": "error" + }, + { + "inputs": [], + "name": "DiamondManagerFacet__InvalidTier", + "type": "error" + }, { "inputs": [], "name": "DiamondManagerFacet__Invalid_Address", @@ -15,6 +30,11 @@ "name": "DiamondManagerFacet__Invalid_Input", "type": "error" }, + { + "inputs": [], + "name": "DiamondManagerFacet__NotAuthorized", + "type": "error" + }, { "inputs": [], "name": "DiamondManagerFacet__Not_Owner", @@ -25,6 +45,19 @@ "name": "DiamondManagerFacet__Season_Not_Finished", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256[]", + "name": "fees", + "type": "uint256[]" + } + ], + "name": "BaseMiningPassFeesUpdated", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -82,25 +115,6 @@ "name": "ClaimFeeReceiversSet", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "tier", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "discountPoints", - "type": "uint256" - } - ], - "name": "DepositDiscountForStratosphereMemberSet", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -162,20 +176,14 @@ { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "tier", - "type": "uint256" - }, { "indexed": false, "internalType": "uint256", - "name": "discountPoints", + "name": "floorBps", "type": "uint256" } ], - "name": "RestakeDiscountForStratosphereMemberSet", + "name": "MiningPassFeeFloorUpdated", "type": "event" }, { @@ -194,7 +202,7 @@ "type": "uint256[]" } ], - "name": "RestakeFeeReceiversSet", + "name": "MiningPassFeeReceiversSet", "type": "event" }, { @@ -202,12 +210,31 @@ "inputs": [ { "indexed": false, - "internalType": "uint256", - "name": "fee", - "type": "uint256" + "internalType": "uint256[]", + "name": "fees", + "type": "uint256[]" } ], - "name": "RestakeFeeSet", + "name": "MiningPassFeesUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address[]", + "name": "receivers", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "proportion", + "type": "uint256[]" + } + ], + "name": "RestakeFeeReceiversSet", "type": "event" }, { @@ -306,25 +333,6 @@ "name": "StratosphereAddressSet", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "tier", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "discountPoints", - "type": "uint256" - } - ], - "name": "UnlockFeeDiscountForStratosphereMemberSet", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -402,6 +410,24 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "newBoostPoints", + "type": "uint256[]" + } + ], + "name": "changeBoostPoints", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "claimTokensForSeason", @@ -409,6 +435,38 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "getAllMiningPassFees", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + } + ], + "name": "getBaseMiningPassTierFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getCurrentSeasonData", @@ -477,6 +535,35 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "getCurrentSeasonUserDetails", + "outputs": [ + { + "internalType": "uint256", + "name": "depositAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "poolShareBips", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "estimatedRewards", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -525,6 +612,76 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getMiningPassFeeFloorBps", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + } + ], + "name": "getMiningPassTierDepositLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + } + ], + "name": "getMiningPassTierFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + } + ], + "name": "getMiningPassTierFloorFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -686,6 +843,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "seasonId", + "type": "uint256" + } + ], + "name": "getSeasonIsClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -1134,6 +1310,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "fees", + "type": "uint256[]" + } + ], + "name": "setBaseMiningPassFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1209,17 +1398,12 @@ { "inputs": [ { - "internalType": "uint256", - "name": "tier", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "discountBasisPoints", - "type": "uint256" + "internalType": "address", + "name": "token", + "type": "address" } ], - "name": "setDepositDiscountForStratosphereMember", + "name": "setDepositToken", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -1228,11 +1412,11 @@ "inputs": [ { "internalType": "address", - "name": "token", + "name": "_emissionManager", "type": "address" } ], - "name": "setDepositToken", + "name": "setEmissionsManager", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -1241,11 +1425,11 @@ "inputs": [ { "internalType": "address", - "name": "_emissionManager", + "name": "executor", "type": "address" } ], - "name": "setEmissionsManager", + "name": "setGelatoExecutor", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -1254,29 +1438,60 @@ "inputs": [ { "internalType": "uint256", - "name": "tier", + "name": "floorBps", "type": "uint256" + } + ], + "name": "setMiningPassFeeFloor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "receivers", + "type": "address[]" }, { - "internalType": "uint256", - "name": "discountBasisPoints", - "type": "uint256" + "internalType": "uint256[]", + "name": "proportion", + "type": "uint256[]" } ], - "name": "setRestakeDiscountForStratosphereMember", + "name": "setMiningPassFeeReceivers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "fees", + "type": "uint256[]" + } + ], + "name": "setMiningPassFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "uint256", + "name": "tier", + "type": "uint256" + }, { "internalType": "uint256", "name": "fee", "type": "uint256" } ], - "name": "setRestakeFee", + "name": "setMiningPassTierFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -1294,6 +1509,13 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "setSeasonClaimed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1338,24 +1560,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "tier", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "discountBasisPoints", - "type": "uint256" - } - ], - "name": "setUnlockFeeDiscountForStratosphereMember", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -1422,19 +1626,37 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_rewardTokenToDistribute", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_endTimestamp", + "type": "uint256" + } + ], + "name": "startNewSeasonWithEndTimestamp", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506125f6806100206000396000f3fe608060405234801561001057600080fd5b50600436106102ff5760003560e01c80638aee81271161019c578063bc67f25f116100ee578063df40958911610097578063e98519a311610071578063e98519a3146108b3578063f55484ac146108c6578063fca7129f146108d957600080fd5b8063df4095891461088d578063e5ea3fdc1461045d578063e8566118146108a057600080fd5b8063d2b291d1116100c8578063d2b291d114610821578063d822bb8714610867578063dbcbb9a31461087a57600080fd5b8063bc67f25f1461077c578063c4882ed714610784578063d18b3d90146107c957600080fd5b80639d6c100f11610150578063b15038791161012a578063b1503879146106d7578063b3afe4961461071c578063b5e007901461076957600080fd5b80639d6c100f1461065b578063a07693eb1461067f578063ae178fda1461069257600080fd5b806398fd006e1161018157806398fd006e146106355780639a56f4e4146104e75780639d0b7d5a1461064857600080fd5b80638aee8127146105dd57806395e2de33146105f057600080fd5b80634dc0cd2b116102555780636bb70f6a11610209578063820d0ad7116101e3578063820d0ad7146105b957806385e3f997146105c15780638a91af17146105ca57600080fd5b80636bb70f6a1461050a5780636e06c64d1461053257806373ad27b01461054557600080fd5b80635e75a6c31161023a5780635e75a6c31461048057806361ccdfba1461048857806366e017c3146104e757600080fd5b80634dc0cd2b1461041b578063562b71531461045d57600080fd5b80633175cbe8116102b75780633d55b37b116102915780633d55b37b146103d25780634784f6bc146103f55780634a477b141461040857600080fd5b80633175cbe81461037b5780633361e38b146103ac57806336a4a844146103bf57600080fd5b806326e74503116102e857806326e745031461032c578063275b629e1461033f5780632c5682eb1461035257600080fd5b80630c4ed799146103045780630fd68c7214610319575b600080fd5b6103176103123660046120db565b6108fc565b005b6103176103273660046120f6565b610a2a565b61031761033a3660046120f6565b610aeb565b61031761034d3660046120f6565b610ba0565b6103656103603660046120db565b610c58565b6040516103729190612118565b60405180910390f35b61039e61038936600461219f565b60009081526004602052604090206005015490565b604051908152602001610372565b6103176103ba3660046122c5565b610d6b565b6103176103cd366004612385565b610efe565b61039e6103e036600461219f565b60009081526004602052604090206002015490565b61031761040336600461219f565b611060565b61039e6104163660046123bb565b611103565b61039e6104293660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b61039e61046b36600461219f565b60009081526004602052604090206003015490565b60025461039e565b6104d26104963660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080546002909101549091565b60408051928352602083019190915201610372565b61039e6104f536600461219f565b60009081526004602052604090206007015490565b601c5460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610372565b6103176105403660046122c5565b61113d565b61055861055336600461219f565b6112c3565b6040516103729190600061010082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b610558611378565b61039e61271081565b6103176105d836600461219f565b61142f565b6103176105eb3660046120db565b611517565b61039e6105fe3660046123bb565b600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff959095168452939052919020015490565b61031761064336600461219f565b61161d565b6103176106563660046120f6565b6116fe565b61039e61066936600461219f565b6000908152600460208190526040909120015490565b61036561068d3660046123bb565b6117bc565b61039e6106a03660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206006015490565b61039e6106e53660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206007015490565b6104d261072a3660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522060028101546003909101549091565b6103176107773660046123e5565b6118ce565b61031761195a565b61039e6107923660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206008015490565b6108116107d73660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292905220600a015460ff1690565b6040519015158152602001610372565b61039e61082f366004612411565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260166020908152604080832093909416825291909152205490565b61039e610875366004612444565b611a7e565b6103176108883660046120f6565b611ac9565b61031761089b36600461219f565b611b7e565b6103176108ae3660046120db565b611cc9565b6103176108c13660046120f6565b611df5565b6103176108d43660046120db565b611eaa565b61039e6108e736600461219f565b60009081526004602052604090206006015490565b8073ffffffffffffffffffffffffffffffffffffffff811661094a576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146109ba576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fa95ef02bd478750565871921654c3eae0063151ae6f3e9824a5d52fd395d016e90600090a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610a9a576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260096020526040908190208290555182907f9c01e5dd1de30d8a56e80595af0414f6b6e41d6e76edc2582cbb0ce06af56d4d90610adf9084815260200190565b60405180910390a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610b5b576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600a6020526040908190208290555182907f4b84f2712b43755e8b18d3d12be201e874c14fe1412df46adc670ffa787ff2d990610adf9084815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610c10576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040908190206002018290555182907f4116cb3bf93ca69e12f15dddabaac80513467c175e1a2fbe7b4ac863ab701fc190610adf9084815260200190565b610cb7604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5060028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff90961684529481529184902084516101608101865281548152600182015493810193909352928301549382019390935260038201546060820152600482015460808201529181015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a015460ff16151561014082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610ddb576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114610e16576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015610e5c57828181518110610e3557610e35612467565b602002602001015182610e4891906124c5565b915080610e54816124d8565b915050610e1a565b506127108114610e98576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251610eab90600c906020860190611fd8565b508151610ebf90600d906020850190612062565b507fbd58a823390daa65d99f8a8b381a804509e21c2078db13de15849c3edaa9a9558383604051610ef1929190612510565b60405180910390a1505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610f6e576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002548015801590610f9157506000818152600460205260409020600201544211155b15610fc8576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fd38160016124c5565b60028190556000818152600460205260409020908155426001820155610fff60ff8416620151806125a1565b61100e9062ffffff16426124c5565b6002828101919091556003820185905560048201859055546040518581527f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906020015b60405180910390a250505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146110d0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281905560405181907f62fa44befc82da349c4e192c274524ec83957f8cad2344147faac6bbbd3aca9e90600090a250565b600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020600201545b92915050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146111ad576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80518251146111e8576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b825181101561122e5782818151811061120757611207612467565b60200260200101518261121a91906124c5565b915080611226816124d8565b9150506111ec565b50612710811461126a576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825161127d906011906020860190611fd8565b508151611291906012906020850190612062565b507f622860cbd141acea4430d275509fb57c7a9e332d2958c44b1821730b3778a1df8383604051610ef1929190612510565b61130b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000908152600460208181526040928390208351610100810185528154815260018201549281019290925260028101549382019390935260038301546060820152908201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b6113c060405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060028054600090815260046020818152604092839020835161010081018552815481526001820154928101929092529384015492810192909252600383015460608301528201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461149f576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156114db576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068190556040518181527f858248b1156bac790ae06ed47561d905c1dfe56347b61de29930c266eb2a1683906020015b60405180910390a150565b8073ffffffffffffffffffffffffffffffffffffffff8116611565576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146115d5576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50601a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461168d576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156116c9576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60138190556040518181527f3ec9282d6ba02f8ec41d078f3734895f058773279f3a7ec54944968c2751fb589060200161150c565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461176e576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156117aa576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000918252600f602052604090912055565b61181b604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b50600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff9590951684529381529183902083516101608101855281548152600182015493810193909352600281015493830193909352600383015460608301526004830154608083015282015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a9091015460ff16151561014082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461193e576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000928352601060209081526040808520938552929052912055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146119ca576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601e54604080517f4fb85e18000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fb85e189160048082019260009290919082900301818387803b158015611a3657600080fd5b505af1158015611a4a573d6000803e3d6000fd5b50506002546040519092507f83a7e21afbe67d7255378f6b4496052f066f91c138d8e5c40602e63fe85f3b429150600090a2565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281206003810154600290910154611ac291906124c5565b9392505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611b39576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260076020526040908190208290555182907f8c5a04c32672ff89885a8de60723fe6ed9a293306cca3db58a1667056ebdab8990610adf9084815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611bee576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002548015801590611c1157506000818152600460205260409020600201544211155b15611c48576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c558260016124c5565b60028190556000818152600460205260409020818155426001820181905591925090611c84906220f5806124c5565b6002820155600381018490556004810184905560405184815282907f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c90602001611052565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611d39576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116611d86576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f7577407244e1eac6eec66ebaf9dc9ddb86aefcb50adde27d0b89b689f73b292590600090a250565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611e65576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260086020526040908190208290555182907f3e3c2c66fc8844a1c34617affd4950ec87cb291ae81938c9b4a0370ab78dd86e90610adf9084815260200190565b8073ffffffffffffffffffffffffffffffffffffffff8116611ef8576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611f68576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fba869e26b357347347ed9cc2f9f7c35185ded23c70d83aa3e3f1d339382c7bbd90600090a25050565b828054828255906000526020600020908101928215612052579160200282015b8281111561205257825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190611ff8565b5061205e92915061209d565b5090565b828054828255906000526020600020908101928215612052579160200282015b82811115612052578251825591602001919060010190612082565b5b8082111561205e576000815560010161209e565b803573ffffffffffffffffffffffffffffffffffffffff811681146120d657600080fd5b919050565b6000602082840312156120ed57600080fd5b611ac2826120b2565b6000806040838503121561210957600080fd5b50508035926020909101359150565b600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100808401518184015250610120808401518184015250610140808401516121978285018215159052565b505092915050565b6000602082840312156121b157600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561222e5761222e6121b8565b604052919050565b600067ffffffffffffffff821115612250576122506121b8565b5060051b60200190565b600082601f83011261226b57600080fd5b8135602061228061227b83612236565b6121e7565b82815260059290921b8401810191818101908684111561229f57600080fd5b8286015b848110156122ba57803583529183019183016122a3565b509695505050505050565b600080604083850312156122d857600080fd5b823567ffffffffffffffff808211156122f057600080fd5b818501915085601f83011261230457600080fd5b8135602061231461227b83612236565b82815260059290921b8401810191818101908984111561233357600080fd5b948201945b8386101561235857612349866120b2565b82529482019490820190612338565b9650508601359250508082111561236e57600080fd5b5061237b8582860161225a565b9150509250929050565b6000806040838503121561239857600080fd5b82359150602083013560ff811681146123b057600080fd5b809150509250929050565b600080604083850312156123ce57600080fd5b6123d7836120b2565b946020939093013593505050565b6000806000606084860312156123fa57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561242457600080fd5b61242d836120b2565b915061243b602084016120b2565b90509250929050565b6000806040838503121561245757600080fd5b8235915061243b602084016120b2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561113757611137612496565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361250957612509612496565b5060010190565b604080825283519082018190526000906020906060840190828701845b8281101561255f57815173ffffffffffffffffffffffffffffffffffffffff168452928401929084019060010161252d565b5050508381038285015284518082528583019183019060005b8181101561259457835183529284019291840191600101612578565b5090979650505050505050565b62ffffff8181168382160280821691908281146121975761219761249656fea264697066735822122087e01047a067c0da9944601c264c83c01a5b8d34f651910c836958eebc5a5cca64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102ff5760003560e01c80638aee81271161019c578063bc67f25f116100ee578063df40958911610097578063e98519a311610071578063e98519a3146108b3578063f55484ac146108c6578063fca7129f146108d957600080fd5b8063df4095891461088d578063e5ea3fdc1461045d578063e8566118146108a057600080fd5b8063d2b291d1116100c8578063d2b291d114610821578063d822bb8714610867578063dbcbb9a31461087a57600080fd5b8063bc67f25f1461077c578063c4882ed714610784578063d18b3d90146107c957600080fd5b80639d6c100f11610150578063b15038791161012a578063b1503879146106d7578063b3afe4961461071c578063b5e007901461076957600080fd5b80639d6c100f1461065b578063a07693eb1461067f578063ae178fda1461069257600080fd5b806398fd006e1161018157806398fd006e146106355780639a56f4e4146104e75780639d0b7d5a1461064857600080fd5b80638aee8127146105dd57806395e2de33146105f057600080fd5b80634dc0cd2b116102555780636bb70f6a11610209578063820d0ad7116101e3578063820d0ad7146105b957806385e3f997146105c15780638a91af17146105ca57600080fd5b80636bb70f6a1461050a5780636e06c64d1461053257806373ad27b01461054557600080fd5b80635e75a6c31161023a5780635e75a6c31461048057806361ccdfba1461048857806366e017c3146104e757600080fd5b80634dc0cd2b1461041b578063562b71531461045d57600080fd5b80633175cbe8116102b75780633d55b37b116102915780633d55b37b146103d25780634784f6bc146103f55780634a477b141461040857600080fd5b80633175cbe81461037b5780633361e38b146103ac57806336a4a844146103bf57600080fd5b806326e74503116102e857806326e745031461032c578063275b629e1461033f5780632c5682eb1461035257600080fd5b80630c4ed799146103045780630fd68c7214610319575b600080fd5b6103176103123660046120db565b6108fc565b005b6103176103273660046120f6565b610a2a565b61031761033a3660046120f6565b610aeb565b61031761034d3660046120f6565b610ba0565b6103656103603660046120db565b610c58565b6040516103729190612118565b60405180910390f35b61039e61038936600461219f565b60009081526004602052604090206005015490565b604051908152602001610372565b6103176103ba3660046122c5565b610d6b565b6103176103cd366004612385565b610efe565b61039e6103e036600461219f565b60009081526004602052604090206002015490565b61031761040336600461219f565b611060565b61039e6104163660046123bb565b611103565b61039e6104293660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b61039e61046b36600461219f565b60009081526004602052604090206003015490565b60025461039e565b6104d26104963660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080546002909101549091565b60408051928352602083019190915201610372565b61039e6104f536600461219f565b60009081526004602052604090206007015490565b601c5460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610372565b6103176105403660046122c5565b61113d565b61055861055336600461219f565b6112c3565b6040516103729190600061010082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b610558611378565b61039e61271081565b6103176105d836600461219f565b61142f565b6103176105eb3660046120db565b611517565b61039e6105fe3660046123bb565b600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff959095168452939052919020015490565b61031761064336600461219f565b61161d565b6103176106563660046120f6565b6116fe565b61039e61066936600461219f565b6000908152600460208190526040909120015490565b61036561068d3660046123bb565b6117bc565b61039e6106a03660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206006015490565b61039e6106e53660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206007015490565b6104d261072a3660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522060028101546003909101549091565b6103176107773660046123e5565b6118ce565b61031761195a565b61039e6107923660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206008015490565b6108116107d73660046123bb565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292905220600a015460ff1690565b6040519015158152602001610372565b61039e61082f366004612411565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260166020908152604080832093909416825291909152205490565b61039e610875366004612444565b611a7e565b6103176108883660046120f6565b611ac9565b61031761089b36600461219f565b611b7e565b6103176108ae3660046120db565b611cc9565b6103176108c13660046120f6565b611df5565b6103176108d43660046120db565b611eaa565b61039e6108e736600461219f565b60009081526004602052604090206006015490565b8073ffffffffffffffffffffffffffffffffffffffff811661094a576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146109ba576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fa95ef02bd478750565871921654c3eae0063151ae6f3e9824a5d52fd395d016e90600090a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610a9a576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260096020526040908190208290555182907f9c01e5dd1de30d8a56e80595af0414f6b6e41d6e76edc2582cbb0ce06af56d4d90610adf9084815260200190565b60405180910390a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610b5b576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600a6020526040908190208290555182907f4b84f2712b43755e8b18d3d12be201e874c14fe1412df46adc670ffa787ff2d990610adf9084815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610c10576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040908190206002018290555182907f4116cb3bf93ca69e12f15dddabaac80513467c175e1a2fbe7b4ac863ab701fc190610adf9084815260200190565b610cb7604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5060028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff90961684529481529184902084516101608101865281548152600182015493810193909352928301549382019390935260038201546060820152600482015460808201529181015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a015460ff16151561014082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610ddb576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114610e16576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015610e5c57828181518110610e3557610e35612467565b602002602001015182610e4891906124c5565b915080610e54816124d8565b915050610e1a565b506127108114610e98576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251610eab90600c906020860190611fd8565b508151610ebf90600d906020850190612062565b507fbd58a823390daa65d99f8a8b381a804509e21c2078db13de15849c3edaa9a9558383604051610ef1929190612510565b60405180910390a1505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610f6e576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002548015801590610f9157506000818152600460205260409020600201544211155b15610fc8576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fd38160016124c5565b60028190556000818152600460205260409020908155426001820155610fff60ff8416620151806125a1565b61100e9062ffffff16426124c5565b6002828101919091556003820185905560048201859055546040518581527f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906020015b60405180910390a250505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146110d0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281905560405181907f62fa44befc82da349c4e192c274524ec83957f8cad2344147faac6bbbd3aca9e90600090a250565b600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020600201545b92915050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146111ad576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80518251146111e8576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b825181101561122e5782818151811061120757611207612467565b60200260200101518261121a91906124c5565b915080611226816124d8565b9150506111ec565b50612710811461126a576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825161127d906011906020860190611fd8565b508151611291906012906020850190612062565b507f622860cbd141acea4430d275509fb57c7a9e332d2958c44b1821730b3778a1df8383604051610ef1929190612510565b61130b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000908152600460208181526040928390208351610100810185528154815260018201549281019290925260028101549382019390935260038301546060820152908201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b6113c060405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060028054600090815260046020818152604092839020835161010081018552815481526001820154928101929092529384015492810192909252600383015460608301528201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461149f576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156114db576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068190556040518181527f858248b1156bac790ae06ed47561d905c1dfe56347b61de29930c266eb2a1683906020015b60405180910390a150565b8073ffffffffffffffffffffffffffffffffffffffff8116611565576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146115d5576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50601a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461168d576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156116c9576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60138190556040518181527f3ec9282d6ba02f8ec41d078f3734895f058773279f3a7ec54944968c2751fb589060200161150c565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461176e576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156117aa576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000918252600f602052604090912055565b61181b604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b50600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff9590951684529381529183902083516101608101855281548152600182015493810193909352600281015493830193909352600383015460608301526004830154608083015282015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a9091015460ff16151561014082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461193e576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000928352601060209081526040808520938552929052912055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146119ca576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601e54604080517f4fb85e18000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fb85e189160048082019260009290919082900301818387803b158015611a3657600080fd5b505af1158015611a4a573d6000803e3d6000fd5b50506002546040519092507f83a7e21afbe67d7255378f6b4496052f066f91c138d8e5c40602e63fe85f3b429150600090a2565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281206003810154600290910154611ac291906124c5565b9392505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611b39576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260076020526040908190208290555182907f8c5a04c32672ff89885a8de60723fe6ed9a293306cca3db58a1667056ebdab8990610adf9084815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611bee576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002548015801590611c1157506000818152600460205260409020600201544211155b15611c48576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c558260016124c5565b60028190556000818152600460205260409020818155426001820181905591925090611c84906220f5806124c5565b6002820155600381018490556004810184905560405184815282907f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c90602001611052565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611d39576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116611d86576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f7577407244e1eac6eec66ebaf9dc9ddb86aefcb50adde27d0b89b689f73b292590600090a250565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611e65576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260086020526040908190208290555182907f3e3c2c66fc8844a1c34617affd4950ec87cb291ae81938c9b4a0370ab78dd86e90610adf9084815260200190565b8073ffffffffffffffffffffffffffffffffffffffff8116611ef8576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611f68576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fba869e26b357347347ed9cc2f9f7c35185ded23c70d83aa3e3f1d339382c7bbd90600090a25050565b828054828255906000526020600020908101928215612052579160200282015b8281111561205257825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190611ff8565b5061205e92915061209d565b5090565b828054828255906000526020600020908101928215612052579160200282015b82811115612052578251825591602001919060010190612082565b5b8082111561205e576000815560010161209e565b803573ffffffffffffffffffffffffffffffffffffffff811681146120d657600080fd5b919050565b6000602082840312156120ed57600080fd5b611ac2826120b2565b6000806040838503121561210957600080fd5b50508035926020909101359150565b600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100808401518184015250610120808401518184015250610140808401516121978285018215159052565b505092915050565b6000602082840312156121b157600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561222e5761222e6121b8565b604052919050565b600067ffffffffffffffff821115612250576122506121b8565b5060051b60200190565b600082601f83011261226b57600080fd5b8135602061228061227b83612236565b6121e7565b82815260059290921b8401810191818101908684111561229f57600080fd5b8286015b848110156122ba57803583529183019183016122a3565b509695505050505050565b600080604083850312156122d857600080fd5b823567ffffffffffffffff808211156122f057600080fd5b818501915085601f83011261230457600080fd5b8135602061231461227b83612236565b82815260059290921b8401810191818101908984111561233357600080fd5b948201945b8386101561235857612349866120b2565b82529482019490820190612338565b9650508601359250508082111561236e57600080fd5b5061237b8582860161225a565b9150509250929050565b6000806040838503121561239857600080fd5b82359150602083013560ff811681146123b057600080fd5b809150509250929050565b600080604083850312156123ce57600080fd5b6123d7836120b2565b946020939093013593505050565b6000806000606084860312156123fa57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561242457600080fd5b61242d836120b2565b915061243b602084016120b2565b90509250929050565b6000806040838503121561245757600080fd5b8235915061243b602084016120b2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561113757611137612496565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361250957612509612496565b5060010190565b604080825283519082018190526000906020906060840190828701845b8281101561255f57815173ffffffffffffffffffffffffffffffffffffffff168452928401929084019060010161252d565b5050508381038285015284518082528583019183019060005b8181101561259457835183529284019291840191600101612578565b5090979650505050505050565b62ffffff8181168382160280821691908281146121975761219761249656fea264697066735822122087e01047a067c0da9944601c264c83c01a5b8d34f651910c836958eebc5a5cca64736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b5061336a806100206000396000f3fe608060405234801561001057600080fd5b506004361061038e5760003560e01c8063830f4cb1116101de578063b5e007901161010f578063df409589116100ad578063f55484ac1161007c578063f55484ac14610a53578063f557f1a914610a66578063fca7129f14610a79578063fe17bd2b14610a9c57600080fd5b8063df40958914610a1a578063e5ea3fdc14610594578063e856611814610a2d578063f008911114610a4057600080fd5b8063d18b3d90116100e9578063d18b3d9014610966578063d2b291d1146109ae578063d822bb87146109f4578063dbcbb9a314610a0757600080fd5b8063b5e0079014610906578063bc67f25f14610919578063c4882ed71461092157600080fd5b80639d0b7d5a1161017c578063ae178fda11610156578063ae178fda1461081c578063b150387914610861578063b234c9c4146108a6578063b3afe496146108b957600080fd5b80639d0b7d5a146107d25780639d6c100f146107e5578063a07693eb1461080957600080fd5b80638aee8127116101b85780638aee81271461075a578063947b43f41461076d57806395e2de331461078d5780639a56f4e41461063157600080fd5b8063830f4cb11461072b57806385e3f9971461073e5780638a91af171461074757600080fd5b80633e131a7a116102c35780635e75a6c3116102615780636e06c64d116102305780636e06c64d1461067c57806373ad27b01461068f578063753b8ece14610703578063820d0ad71461072357600080fd5b80635e75a6c3146105ca57806361ccdfba146105d257806366e017c3146106315780636bb70f6a1461065457600080fd5b80634dc0cd2b1161029d5780634dc0cd2b1461053f578063560cf6f514610581578063562b7153146105945780635c1624ab146105b757600080fd5b80633e131a7a146105065780634784f6bc146105195780634a477b141461052c57600080fd5b80632d4136a6116103305780633361e38b1161030a5780633361e38b146104b557806336a4a844146104c85780633940acb4146104db5780633d55b37b146104e357600080fd5b80632d4136a61461044a5780632e11ca8b1461047d5780633175cbe81461049257600080fd5b8063142950d61161036c578063142950d6146103fc578063275b629e14610404578063278a93e2146104175780632c5682eb1461042a57600080fd5b80630c4ed799146103935780630c7d72a7146103a85780630cc1687a146103db575b600080fd5b6103a66103a1366004612cf9565b610abc565b005b6103bb6103b6366004612cf9565b610bea565b604080519384526020840192909252908201526060015b60405180910390f35b6103ee6103e9366004612d14565b610db2565b6040519081526020016103d2565b6103a6610de3565b6103a6610412366004612d2d565b610e68565b6103a6610425366004612d4f565b610f2c565b61043d610438366004612cf9565b6110e6565b6040516103d29190612dc4565b61046d610458366004612d14565b6000908152601e602052604090205460ff1690565b60405190151581526020016103d2565b6104856111f9565b6040516103d29190612e86565b6103ee6104a0366004612d14565b60009081526004602052604090206005015490565b6103a66104c3366004612fa6565b61126a565b6103a66104d6366004613066565b6113f0565b6016546103ee565b6103ee6104f1366004612d14565b60009081526004602052604090206002015490565b6103a6610514366004612d4f565b611552565b6103a6610527366004612d14565b61167c565b6103ee61053a36600461309c565b61171f565b6103ee61054d36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b6103a661058f366004612d2d565b611759565b6103ee6105a2366004612d14565b60009081526004602052604090206003015490565b6103a66105c5366004612fa6565b61186c565b6002546103ee565b61061c6105e036600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080546002909101549091565b604080519283526020830191909152016103d2565b6103ee61063f366004612d14565b60009081526004602052604090206007015490565b601a5460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103d2565b6103a661068a366004612fa6565b611a50565b6106a261069d366004612d14565b611bd6565b6040516103d29190600061010082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6103ee610711366004612d14565b60009081526015602052604090205490565b6106a2611c8b565b6103a6610739366004612d2d565b611d42565b6103ee61271081565b6103a6610755366004612d14565b611ef2565b6103a6610768366004612cf9565b611fda565b6103ee61077b366004612d14565b60009081526011602052604090205490565b6103ee61079b36600461309c565b600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff959095168452939052919020015490565b6103a66107e0366004612d2d565b6120e0565b6103ee6107f3366004612d14565b6000908152600460208190526040909120015490565b61043d61081736600461309c565b61219f565b6103ee61082a36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206006015490565b6103ee61086f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206007015490565b6103a66108b4366004612fa6565b6122b1565b61061c6108c736600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522060028101546003909101549091565b6103a66109143660046130c6565b612437565b6103a66124c3565b6103ee61092f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206008015490565b61046d61097436600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292905220600a015460ff1690565b6103ee6109bc3660046130f2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260106020908152604080832093909416825291909152205490565b6103ee610a02366004613125565b6125c0565b6103a6610a15366004612d2d565b612604565b6103a6610a28366004612d14565b6126b9565b6103a6610a3b366004612cf9565b612804565b6103a6610a4e366004612d14565b612930565b6103a6610a61366004612cf9565b612a11565b6103a6610a74366004612cf9565b612b3f565b6103ee610a87366004612d14565b60009081526004602052604090206006015490565b6103ee610aaa366004612d14565b60009081526012602052604090205490565b8073ffffffffffffffffffffffffffffffffffffffff8116610b0a576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610b7a576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fa95ef02bd478750565871921654c3eae0063151ae6f3e9824a5d52fd395d016e90600090a25050565b6000806000806000600201549050600080600501600083815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518061016001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900460ff1615151515815250509050600080600401600084815260200190815260200160002060405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815250509050600082606001518360400151610d649190613177565b835160e0840151909850909150610d7d8261271061318a565b610d8791906131a1565b9550612710868360600151610d9c919061318a565b610da691906131a1565b96989597505050505050565b60008181526015602052604081205460165461271090610dd2908361318a565b610ddc91906131a1565b9392505050565b3360009081526020819052604090205460ff16610e2c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546000908152601e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610ed8576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040908190206002018290555182907f4116cb3bf93ca69e12f15dddabaac80513467c175e1a2fbe7b4ac863ab701fc190610f209084815260200190565b60405180910390a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610f9c576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b8114610fd6576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60165460005b600b8110156110a75760008181526015602052604081205490612710611002858461318a565b61100c91906131a1565b905060008311801561103557508086868581811061102c5761102c6131dc565b90506020020135105b1561106c576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85858481811061107e5761107e6131dc565b600086815260116020908152604090912091029290920135909155505060019091019050610fdc565b507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c83836040516110d992919061320b565b60405180910390a1505050565b611145604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5060028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff90961684529481529184902084516101608101865281548152600182015493810193909352928301549382019390935260038201546060820152600482015460808201529181015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a015460ff16151561014082015290565b60408051600b808252610180820190925260609160009190602082016101608036833701905050905060005b600b811015611264576000818152601160205260409020548251839083908110611251576112516131dc565b6020908102919091010152600101611225565b50919050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146112da576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611315576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b825181101561135b57828181518110611334576113346131dc565b6020026020010151826113479190613177565b9150806113538161325d565b915050611319565b506127108114611397576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516113aa906009906020860190612bf6565b5081516113be90600a906020850190612c80565b507fbd58a823390daa65d99f8a8b381a804509e21c2078db13de15849c3edaa9a95583836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611460576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061148357506000818152600460205260409020600201544211155b156114ba576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c5816001613177565b600281905560008181526004602052604090209081554260018201556114f160ff841662015180613302565b6115009062ffffff1642613177565b6002828101919091556003820185905560048201859055546040518581527f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906020015b60405180910390a250505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146115c2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b81146115fc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600b81101561163e5782828281811061161a5761161a6131dc565b600084815260156020908152604090912091029290920135909155506001016115ff565b507f7bcea34b82e222069291852af10dd0ce9909b890c8e851c52fd83de87883093d828260405161167092919061320b565b60405180910390a15050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146116ec576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281905560405181907f62fa44befc82da349c4e192c274524ec83957f8cad2344147faac6bbbd3aca9e90600090a250565b600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020600201545b92915050565b3360009081526020819052604090205460ff166117a2576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025480158015906117c557506000818152600460205260409020600201544211155b156117fc576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611807816001613177565b6002818155600082815260046020819052604091829020938455426001850155838301869055600384018790558301869055905490517f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906115449087815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146118dc576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611917576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090815b8451811015611a235760008281526005602052604081208651829088908590811061194c5761194c6131dc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008583815181106119a4576119a46131dc565b6020026020010151905081600001546000036119ec576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038201546119fb8282613321565b611a059087613177565b60039093019190915550925080611a1b8161325d565b91505061191f565b5060008181526004602052604081206007018054849290611a45908490613321565b909155505050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611ac0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611afb576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015611b4157828181518110611b1a57611b1a6131dc565b602002602001015182611b2d9190613177565b915080611b398161325d565b915050611aff565b506127108114611b7d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251611b9090600e906020860190612bf6565b508151611ba490600f906020850190612c80565b507f622860cbd141acea4430d275509fb57c7a9e332d2958c44b1821730b3778a1df83836040516110d9929190613295565b611c1e60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000908152600460208181526040928390208351610100810185528154815260018201549281019290925260028101549382019390935260038301546060820152908201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b611cd360405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060028054600090815260046020818152604092839020835161010081018552815481526001820154928101929092529384015492810192909252600383015460608301528201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611db2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a821115611ded576040517fcbbe0f4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526015602052604081205460165490919061271090611e10908461318a565b611e1a91906131a1565b9050600084118015611e2b57508083105b15611e62576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526011602052604080822085905580516001808252818301909252908160200160208202803683370190505090508381600081518110611ea857611ea86131dc565b6020026020010181815250507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c81604051611ee39190612e86565b60405180910390a15050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611f62576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115611f9e576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068190556040518181527f858248b1156bac790ae06ed47561d905c1dfe56347b61de29930c266eb2a1683906020015b60405180910390a150565b8073ffffffffffffffffffffffffffffffffffffffff8116612028576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612098576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50601880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612150576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b623d090081111561218d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000918252600c602052604090912055565b6121fe604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b50600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff9590951684529381529183902083516101608101855281548152600182015493810193909352600281015493830193909352600383015460608301526004830154608083015282015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a9091015460ff16151561014082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612321576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805182511461235c576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b82518110156123a25782818151811061237b5761237b6131dc565b60200260200101518261238e9190613177565b91508061239a8161325d565b915050612360565b5061271081146123de576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516123f1906013906020860190612bf6565b508151612405906014906020850190612c80565b507fdabc66011f68fc990a5a3b502413fcfcd16c0788b1017255c8fa0745a2954cb283836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146124a7576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000928352600d60209081526040808520938552929052912055565b3360009081526020819052604090205460ff1661250c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c54604080517f4fb85e18000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fb85e189160048082019260009290919082900301818387803b15801561257857600080fd5b505af115801561258c573d6000803e3d6000fd5b50506002546040519092507f83a7e21afbe67d7255378f6b4496052f066f91c138d8e5c40602e63fe85f3b429150600090a2565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281206003810154600290910154610ddc9190613177565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612674576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260076020526040908190208290555182907f8c5a04c32672ff89885a8de60723fe6ed9a293306cca3db58a1667056ebdab8990610f209084815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612729576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061274c57506000818152600460205260409020600201544211155b15612783576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612790826001613177565b600281905560008181526004602052604090208181554260018201819055919250906127bf906220f580613177565b6002820155600381018490556004810184905560405184815282907f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c90602001611544565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612874576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166128c1576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f7577407244e1eac6eec66ebaf9dc9ddb86aefcb50adde27d0b89b689f73b292590600090a250565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146129a0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156129dc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60168190556040518181527f585b544b2d9ebfba0b4030c5b12086c7e40b39d2bf7317868b70dad5a8fd06cc90602001611fcf565b8073ffffffffffffffffffffffffffffffffffffffff8116612a5f576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612acf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fba869e26b357347347ed9cc2f9f7c35185ded23c70d83aa3e3f1d339382c7bbd90600090a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612baf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c7057825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190612c16565b50612c7c929150612cbb565b5090565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c70578251825591602001919060010190612ca0565b5b80821115612c7c5760008155600101612cbc565b803573ffffffffffffffffffffffffffffffffffffffff81168114612cf457600080fd5b919050565b600060208284031215612d0b57600080fd5b610ddc82612cd0565b600060208284031215612d2657600080fd5b5035919050565b60008060408385031215612d4057600080fd5b50508035926020909101359150565b60008060208385031215612d6257600080fd5b823567ffffffffffffffff80821115612d7a57600080fd5b818501915085601f830112612d8e57600080fd5b813581811115612d9d57600080fd5b8660208260051b8501011115612db257600080fd5b60209290920196919550909350505050565b600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151612e438285018215159052565b505092915050565b600081518084526020808501945080840160005b83811015612e7b57815187529582019590820190600101612e5f565b509495945050505050565b602081526000610ddc6020830184612e4b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f0f57612f0f612e99565b604052919050565b600067ffffffffffffffff821115612f3157612f31612e99565b5060051b60200190565b600082601f830112612f4c57600080fd5b81356020612f61612f5c83612f17565b612ec8565b82815260059290921b84018101918181019086841115612f8057600080fd5b8286015b84811015612f9b5780358352918301918301612f84565b509695505050505050565b60008060408385031215612fb957600080fd5b823567ffffffffffffffff80821115612fd157600080fd5b818501915085601f830112612fe557600080fd5b81356020612ff5612f5c83612f17565b82815260059290921b8401810191818101908984111561301457600080fd5b948201945b838610156130395761302a86612cd0565b82529482019490820190613019565b9650508601359250508082111561304f57600080fd5b5061305c85828601612f3b565b9150509250929050565b6000806040838503121561307957600080fd5b82359150602083013560ff8116811461309157600080fd5b809150509250929050565b600080604083850312156130af57600080fd5b6130b883612cd0565b946020939093013593505050565b6000806000606084860312156130db57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561310557600080fd5b61310e83612cd0565b915061311c60208401612cd0565b90509250929050565b6000806040838503121561313857600080fd5b8235915061311c60208401612cd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561175357611753613148565b808202811582820484141761175357611753613148565b6000826131d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561324457600080fd5b8260051b80856040850137919091016040019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361328e5761328e613148565b5060010190565b604080825283519082018190526000906020906060840190828701845b828110156132e457815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016132b2565b505050838103828501526132f88186612e4b565b9695505050505050565b62ffffff818116838216028082169190828114612e4357612e43613148565b818103818111156117535761175361314856fea2646970667358221220a7bbf270b56dceb25cc72e77dbea001cc2115d4f67bed66b6a1492e299e8629d64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061038e5760003560e01c8063830f4cb1116101de578063b5e007901161010f578063df409589116100ad578063f55484ac1161007c578063f55484ac14610a53578063f557f1a914610a66578063fca7129f14610a79578063fe17bd2b14610a9c57600080fd5b8063df40958914610a1a578063e5ea3fdc14610594578063e856611814610a2d578063f008911114610a4057600080fd5b8063d18b3d90116100e9578063d18b3d9014610966578063d2b291d1146109ae578063d822bb87146109f4578063dbcbb9a314610a0757600080fd5b8063b5e0079014610906578063bc67f25f14610919578063c4882ed71461092157600080fd5b80639d0b7d5a1161017c578063ae178fda11610156578063ae178fda1461081c578063b150387914610861578063b234c9c4146108a6578063b3afe496146108b957600080fd5b80639d0b7d5a146107d25780639d6c100f146107e5578063a07693eb1461080957600080fd5b80638aee8127116101b85780638aee81271461075a578063947b43f41461076d57806395e2de331461078d5780639a56f4e41461063157600080fd5b8063830f4cb11461072b57806385e3f9971461073e5780638a91af171461074757600080fd5b80633e131a7a116102c35780635e75a6c3116102615780636e06c64d116102305780636e06c64d1461067c57806373ad27b01461068f578063753b8ece14610703578063820d0ad71461072357600080fd5b80635e75a6c3146105ca57806361ccdfba146105d257806366e017c3146106315780636bb70f6a1461065457600080fd5b80634dc0cd2b1161029d5780634dc0cd2b1461053f578063560cf6f514610581578063562b7153146105945780635c1624ab146105b757600080fd5b80633e131a7a146105065780634784f6bc146105195780634a477b141461052c57600080fd5b80632d4136a6116103305780633361e38b1161030a5780633361e38b146104b557806336a4a844146104c85780633940acb4146104db5780633d55b37b146104e357600080fd5b80632d4136a61461044a5780632e11ca8b1461047d5780633175cbe81461049257600080fd5b8063142950d61161036c578063142950d6146103fc578063275b629e14610404578063278a93e2146104175780632c5682eb1461042a57600080fd5b80630c4ed799146103935780630c7d72a7146103a85780630cc1687a146103db575b600080fd5b6103a66103a1366004612cf9565b610abc565b005b6103bb6103b6366004612cf9565b610bea565b604080519384526020840192909252908201526060015b60405180910390f35b6103ee6103e9366004612d14565b610db2565b6040519081526020016103d2565b6103a6610de3565b6103a6610412366004612d2d565b610e68565b6103a6610425366004612d4f565b610f2c565b61043d610438366004612cf9565b6110e6565b6040516103d29190612dc4565b61046d610458366004612d14565b6000908152601e602052604090205460ff1690565b60405190151581526020016103d2565b6104856111f9565b6040516103d29190612e86565b6103ee6104a0366004612d14565b60009081526004602052604090206005015490565b6103a66104c3366004612fa6565b61126a565b6103a66104d6366004613066565b6113f0565b6016546103ee565b6103ee6104f1366004612d14565b60009081526004602052604090206002015490565b6103a6610514366004612d4f565b611552565b6103a6610527366004612d14565b61167c565b6103ee61053a36600461309c565b61171f565b6103ee61054d36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b6103a661058f366004612d2d565b611759565b6103ee6105a2366004612d14565b60009081526004602052604090206003015490565b6103a66105c5366004612fa6565b61186c565b6002546103ee565b61061c6105e036600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080546002909101549091565b604080519283526020830191909152016103d2565b6103ee61063f366004612d14565b60009081526004602052604090206007015490565b601a5460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103d2565b6103a661068a366004612fa6565b611a50565b6106a261069d366004612d14565b611bd6565b6040516103d29190600061010082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6103ee610711366004612d14565b60009081526015602052604090205490565b6106a2611c8b565b6103a6610739366004612d2d565b611d42565b6103ee61271081565b6103a6610755366004612d14565b611ef2565b6103a6610768366004612cf9565b611fda565b6103ee61077b366004612d14565b60009081526011602052604090205490565b6103ee61079b36600461309c565b600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff959095168452939052919020015490565b6103a66107e0366004612d2d565b6120e0565b6103ee6107f3366004612d14565b6000908152600460208190526040909120015490565b61043d61081736600461309c565b61219f565b6103ee61082a36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206006015490565b6103ee61086f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206007015490565b6103a66108b4366004612fa6565b6122b1565b61061c6108c736600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522060028101546003909101549091565b6103a66109143660046130c6565b612437565b6103a66124c3565b6103ee61092f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206008015490565b61046d61097436600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292905220600a015460ff1690565b6103ee6109bc3660046130f2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260106020908152604080832093909416825291909152205490565b6103ee610a02366004613125565b6125c0565b6103a6610a15366004612d2d565b612604565b6103a6610a28366004612d14565b6126b9565b6103a6610a3b366004612cf9565b612804565b6103a6610a4e366004612d14565b612930565b6103a6610a61366004612cf9565b612a11565b6103a6610a74366004612cf9565b612b3f565b6103ee610a87366004612d14565b60009081526004602052604090206006015490565b6103ee610aaa366004612d14565b60009081526012602052604090205490565b8073ffffffffffffffffffffffffffffffffffffffff8116610b0a576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610b7a576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fa95ef02bd478750565871921654c3eae0063151ae6f3e9824a5d52fd395d016e90600090a25050565b6000806000806000600201549050600080600501600083815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518061016001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900460ff1615151515815250509050600080600401600084815260200190815260200160002060405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815250509050600082606001518360400151610d649190613177565b835160e0840151909850909150610d7d8261271061318a565b610d8791906131a1565b9550612710868360600151610d9c919061318a565b610da691906131a1565b96989597505050505050565b60008181526015602052604081205460165461271090610dd2908361318a565b610ddc91906131a1565b9392505050565b3360009081526020819052604090205460ff16610e2c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546000908152601e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610ed8576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040908190206002018290555182907f4116cb3bf93ca69e12f15dddabaac80513467c175e1a2fbe7b4ac863ab701fc190610f209084815260200190565b60405180910390a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610f9c576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b8114610fd6576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60165460005b600b8110156110a75760008181526015602052604081205490612710611002858461318a565b61100c91906131a1565b905060008311801561103557508086868581811061102c5761102c6131dc565b90506020020135105b1561106c576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85858481811061107e5761107e6131dc565b600086815260116020908152604090912091029290920135909155505060019091019050610fdc565b507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c83836040516110d992919061320b565b60405180910390a1505050565b611145604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5060028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff90961684529481529184902084516101608101865281548152600182015493810193909352928301549382019390935260038201546060820152600482015460808201529181015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a015460ff16151561014082015290565b60408051600b808252610180820190925260609160009190602082016101608036833701905050905060005b600b811015611264576000818152601160205260409020548251839083908110611251576112516131dc565b6020908102919091010152600101611225565b50919050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146112da576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611315576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b825181101561135b57828181518110611334576113346131dc565b6020026020010151826113479190613177565b9150806113538161325d565b915050611319565b506127108114611397576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516113aa906009906020860190612bf6565b5081516113be90600a906020850190612c80565b507fbd58a823390daa65d99f8a8b381a804509e21c2078db13de15849c3edaa9a95583836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611460576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061148357506000818152600460205260409020600201544211155b156114ba576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c5816001613177565b600281905560008181526004602052604090209081554260018201556114f160ff841662015180613302565b6115009062ffffff1642613177565b6002828101919091556003820185905560048201859055546040518581527f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906020015b60405180910390a250505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146115c2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b81146115fc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600b81101561163e5782828281811061161a5761161a6131dc565b600084815260156020908152604090912091029290920135909155506001016115ff565b507f7bcea34b82e222069291852af10dd0ce9909b890c8e851c52fd83de87883093d828260405161167092919061320b565b60405180910390a15050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146116ec576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281905560405181907f62fa44befc82da349c4e192c274524ec83957f8cad2344147faac6bbbd3aca9e90600090a250565b600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020600201545b92915050565b3360009081526020819052604090205460ff166117a2576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025480158015906117c557506000818152600460205260409020600201544211155b156117fc576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611807816001613177565b6002818155600082815260046020819052604091829020938455426001850155838301869055600384018790558301869055905490517f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906115449087815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146118dc576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611917576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090815b8451811015611a235760008281526005602052604081208651829088908590811061194c5761194c6131dc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008583815181106119a4576119a46131dc565b6020026020010151905081600001546000036119ec576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038201546119fb8282613321565b611a059087613177565b60039093019190915550925080611a1b8161325d565b91505061191f565b5060008181526004602052604081206007018054849290611a45908490613321565b909155505050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611ac0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611afb576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015611b4157828181518110611b1a57611b1a6131dc565b602002602001015182611b2d9190613177565b915080611b398161325d565b915050611aff565b506127108114611b7d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251611b9090600e906020860190612bf6565b508151611ba490600f906020850190612c80565b507f622860cbd141acea4430d275509fb57c7a9e332d2958c44b1821730b3778a1df83836040516110d9929190613295565b611c1e60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000908152600460208181526040928390208351610100810185528154815260018201549281019290925260028101549382019390935260038301546060820152908201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b611cd360405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060028054600090815260046020818152604092839020835161010081018552815481526001820154928101929092529384015492810192909252600383015460608301528201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611db2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a821115611ded576040517fcbbe0f4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526015602052604081205460165490919061271090611e10908461318a565b611e1a91906131a1565b9050600084118015611e2b57508083105b15611e62576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526011602052604080822085905580516001808252818301909252908160200160208202803683370190505090508381600081518110611ea857611ea86131dc565b6020026020010181815250507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c81604051611ee39190612e86565b60405180910390a15050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611f62576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115611f9e576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068190556040518181527f858248b1156bac790ae06ed47561d905c1dfe56347b61de29930c266eb2a1683906020015b60405180910390a150565b8073ffffffffffffffffffffffffffffffffffffffff8116612028576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612098576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50601880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612150576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b623d090081111561218d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000918252600c602052604090912055565b6121fe604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b50600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff9590951684529381529183902083516101608101855281548152600182015493810193909352600281015493830193909352600383015460608301526004830154608083015282015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a9091015460ff16151561014082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612321576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805182511461235c576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b82518110156123a25782818151811061237b5761237b6131dc565b60200260200101518261238e9190613177565b91508061239a8161325d565b915050612360565b5061271081146123de576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516123f1906013906020860190612bf6565b508151612405906014906020850190612c80565b507fdabc66011f68fc990a5a3b502413fcfcd16c0788b1017255c8fa0745a2954cb283836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146124a7576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000928352600d60209081526040808520938552929052912055565b3360009081526020819052604090205460ff1661250c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c54604080517f4fb85e18000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fb85e189160048082019260009290919082900301818387803b15801561257857600080fd5b505af115801561258c573d6000803e3d6000fd5b50506002546040519092507f83a7e21afbe67d7255378f6b4496052f066f91c138d8e5c40602e63fe85f3b429150600090a2565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281206003810154600290910154610ddc9190613177565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612674576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260076020526040908190208290555182907f8c5a04c32672ff89885a8de60723fe6ed9a293306cca3db58a1667056ebdab8990610f209084815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612729576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061274c57506000818152600460205260409020600201544211155b15612783576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612790826001613177565b600281905560008181526004602052604090208181554260018201819055919250906127bf906220f580613177565b6002820155600381018490556004810184905560405184815282907f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c90602001611544565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612874576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166128c1576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f7577407244e1eac6eec66ebaf9dc9ddb86aefcb50adde27d0b89b689f73b292590600090a250565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146129a0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156129dc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60168190556040518181527f585b544b2d9ebfba0b4030c5b12086c7e40b39d2bf7317868b70dad5a8fd06cc90602001611fcf565b8073ffffffffffffffffffffffffffffffffffffffff8116612a5f576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612acf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fba869e26b357347347ed9cc2f9f7c35185ded23c70d83aa3e3f1d339382c7bbd90600090a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612baf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c7057825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190612c16565b50612c7c929150612cbb565b5090565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c70578251825591602001919060010190612ca0565b5b80821115612c7c5760008155600101612cbc565b803573ffffffffffffffffffffffffffffffffffffffff81168114612cf457600080fd5b919050565b600060208284031215612d0b57600080fd5b610ddc82612cd0565b600060208284031215612d2657600080fd5b5035919050565b60008060408385031215612d4057600080fd5b50508035926020909101359150565b60008060208385031215612d6257600080fd5b823567ffffffffffffffff80821115612d7a57600080fd5b818501915085601f830112612d8e57600080fd5b813581811115612d9d57600080fd5b8660208260051b8501011115612db257600080fd5b60209290920196919550909350505050565b600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151612e438285018215159052565b505092915050565b600081518084526020808501945080840160005b83811015612e7b57815187529582019590820190600101612e5f565b509495945050505050565b602081526000610ddc6020830184612e4b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f0f57612f0f612e99565b604052919050565b600067ffffffffffffffff821115612f3157612f31612e99565b5060051b60200190565b600082601f830112612f4c57600080fd5b81356020612f61612f5c83612f17565b612ec8565b82815260059290921b84018101918181019086841115612f8057600080fd5b8286015b84811015612f9b5780358352918301918301612f84565b509695505050505050565b60008060408385031215612fb957600080fd5b823567ffffffffffffffff80821115612fd157600080fd5b818501915085601f830112612fe557600080fd5b81356020612ff5612f5c83612f17565b82815260059290921b8401810191818101908984111561301457600080fd5b948201945b838610156130395761302a86612cd0565b82529482019490820190613019565b9650508601359250508082111561304f57600080fd5b5061305c85828601612f3b565b9150509250929050565b6000806040838503121561307957600080fd5b82359150602083013560ff8116811461309157600080fd5b809150509250929050565b600080604083850312156130af57600080fd5b6130b883612cd0565b946020939093013593505050565b6000806000606084860312156130db57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561310557600080fd5b61310e83612cd0565b915061311c60208401612cd0565b90509250929050565b6000806040838503121561313857600080fd5b8235915061311c60208401612cd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561175357611753613148565b808202811582820484141761175357611753613148565b6000826131d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561324457600080fd5b8260051b80856040850137919091016040019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361328e5761328e613148565b5060010190565b604080825283519082018190526000906020906060840190828701845b828110156132e457815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016132b2565b505050838103828501526132f88186612e4b565b9695505050505050565b62ffffff818116838216028082169190828114612e4357612e43613148565b818103818111156117535761175361314856fea2646970667358221220a7bbf270b56dceb25cc72e77dbea001cc2115d4f67bed66b6a1492e299e8629d64736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, "options": { "args": [], "log": true, - "skipIfAlreadyDeployed": false + "skipIfAlreadyDeployed": true }, - "address": "0x41D4845bFFd43C4dB447a9F819d52Bc2876B9238" + "address": "0x0F24f5B58B5c9a06305BE1e3a2Ac3CbE46A5eDc4" }, "hardhat": { "artifact": { diff --git a/deployments/FeeCollectorFacet.json b/deployments/FeeCollectorFacet.json index caf86c5..515ff00 100644 --- a/deployments/FeeCollectorFacet.json +++ b/deployments/FeeCollectorFacet.json @@ -10,6 +10,11 @@ "name": "FeeCollectorFacet__Only_Owner", "type": "error" }, + { + "inputs": [], + "name": "LAuthorizable__OnlyAuthorized", + "type": "error" + }, { "inputs": [], "name": "collectBoostFees", @@ -25,17 +30,17 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061058a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063238e2b2b1461003b578063b2e07cf414610045575b600080fd5b61004361004d565b005b610043610278565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146100bd576040517f117239d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c805460195473ffffffffffffffffffffffffffffffffffffffff1660005b828110156102725760008060160160008684815481106100ff576100ff61049d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182209387168252929092528120548654909250601690829088908690811061015d5761015d61049d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182209388168083529390522091909155855463a9059cbb908790859081106101bb576101bb61049d565b60009182526020909120015460405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025d91906104cc565b5050808061026a906104f5565b9150506100dd565b50505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146102e8576040517f117239d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60118054601b5473ffffffffffffffffffffffffffffffffffffffff1660005b8281101561027257600080601601600086848154811061032a5761032a61049d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220938716825292909252812054865490925060169082908890869081106103885761038861049d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182209388168083529390522091909155855463a9059cbb908790859081106103e6576103e661049d565b60009182526020909120015460405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610464573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048891906104cc565b50508080610495906104f5565b915050610308565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156104de57600080fd5b815180151581146104ee57600080fd5b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361054d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea2646970667358221220c290cfe042c38279fc9f9c85b16e47acf4bfc0430bcc683257b585f20a0672f264736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063238e2b2b1461003b578063b2e07cf414610045575b600080fd5b61004361004d565b005b610043610278565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146100bd576040517f117239d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c805460195473ffffffffffffffffffffffffffffffffffffffff1660005b828110156102725760008060160160008684815481106100ff576100ff61049d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182209387168252929092528120548654909250601690829088908690811061015d5761015d61049d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182209388168083529390522091909155855463a9059cbb908790859081106101bb576101bb61049d565b60009182526020909120015460405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025d91906104cc565b5050808061026a906104f5565b9150506100dd565b50505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146102e8576040517f117239d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60118054601b5473ffffffffffffffffffffffffffffffffffffffff1660005b8281101561027257600080601601600086848154811061032a5761032a61049d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220938716825292909252812054865490925060169082908890869081106103885761038861049d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182209388168083529390522091909155855463a9059cbb908790859081106103e6576103e661049d565b60009182526020909120015460405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610464573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048891906104cc565b50508080610495906104f5565b915050610308565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156104de57600080fd5b815180151581146104ee57600080fd5b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361054d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea2646970667358221220c290cfe042c38279fc9f9c85b16e47acf4bfc0430bcc683257b585f20a0672f264736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b506106f5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063238e2b2b1461003b578063b2e07cf414610045575b600080fd5b61004361004d565b005b6100436102fc565b6100586000336105a5565b6000806009018054806020026020016040519081016040528092919081815260200182805480156100bf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610094575b505083516017549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f657600080601001600086848151811061010a5761010a610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008060100160008785815181106101a6576101a6610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061025757610257610608565b6020026020010151836040518363ffffffff1660e01b815260040161029e92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156102bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e19190610637565b505080806102ee90610660565b9150506100e8565b50505050565b6103076000336105a5565b600080600e0180548060200260200160405190810160405280929190818152602001828054801561036e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610343575b505083516019549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f65760008060100160008684815181106103b9576103b9610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600080601001600087858151811061045557610455610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061050657610506610608565b6020026020010151836040518363ffffffff1660e01b815260040161054d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561056c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105909190610637565b5050808061059d90610660565b915050610397565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff16610604576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561064957600080fd5b8151801515811461065957600080fd5b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea2646970667358221220774cf0d06b84ab9ac34a7a54f8fbea51f4647defb8c7192b22d230618d4075f764736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063238e2b2b1461003b578063b2e07cf414610045575b600080fd5b61004361004d565b005b6100436102fc565b6100586000336105a5565b6000806009018054806020026020016040519081016040528092919081815260200182805480156100bf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610094575b505083516017549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f657600080601001600086848151811061010a5761010a610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008060100160008785815181106101a6576101a6610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061025757610257610608565b6020026020010151836040518363ffffffff1660e01b815260040161029e92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156102bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e19190610637565b505080806102ee90610660565b9150506100e8565b50505050565b6103076000336105a5565b600080600e0180548060200260200160405190810160405280929190818152602001828054801561036e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610343575b505083516019549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f65760008060100160008684815181106103b9576103b9610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600080601001600087858151811061045557610455610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061050657610506610608565b6020026020010151836040518363ffffffff1660e01b815260040161054d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561056c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105909190610637565b5050808061059d90610660565b915050610397565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff16610604576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561064957600080fd5b8151801515811461065957600080fd5b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea2646970667358221220774cf0d06b84ab9ac34a7a54f8fbea51f4647defb8c7192b22d230618d4075f764736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, "options": { "args": [], "log": true, - "skipIfAlreadyDeployed": false + "skipIfAlreadyDeployed": true }, - "address": "0xB9fE7D7BFDD8f8F22d7148715273f5044b3eA111" + "address": "0x115A70C959aabCD71ac2086940985Aeb1e1a6BbF" }, "hardhat": { "artifact": { diff --git a/deployments/MiningPassFacet.json b/deployments/MiningPassFacet.json index 24d5295..874f904 100644 --- a/deployments/MiningPassFacet.json +++ b/deployments/MiningPassFacet.json @@ -10,6 +10,11 @@ "name": "MiningPassFacet__InsufficientBalance", "type": "error" }, + { + "inputs": [], + "name": "MiningPassFacet__InvalidFeeReceivers", + "type": "error" + }, { "inputs": [], "name": "MiningPassFacet__InvalidTier", @@ -51,6 +56,30 @@ "name": "MiningPassPurchase", "type": "event" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tier", + "type": "uint256" + } + ], + "name": "getMiningPassFee", + "outputs": [ + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -89,8 +118,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506104f9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063efef39a11461003b578063fe315a1314610050575b600080fd5b61004e6100493660046103f2565b610139565b005b61012061005e36600461040b565b60028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616845294815284832085516101608101875281548152600182015481840152948101548587015260038101546060860152600481015460808601529182015460a0850152600682015460c0850152600782015460e0850152600882015461010085015260098201546101208501819052600a9092015460ff16151561014090940193909352808252601890925291909120549091565b6040805192835260208301919091520160405180910390f35b601b546002546000818152600560209081526040808320338452909152902073ffffffffffffffffffffffffffffffffffffffff90921691831580610182575080600901548411155b156101b9576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600981015460009081526017602052604080822054868352908220546101df9190610448565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152909150819073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa15801561024e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102729190610488565b10156102aa576040517f0289a60100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526004602052604090206002015442106102f4576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600982018590556040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8516906323b872dd906064016020604051808303816000875af1158015610374573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039891906104a1565b50843373ffffffffffffffffffffffffffffffffffffffff16847fea32e0bbe6b44ae07c7113eff6123c3921029d514dc3383bfd3868da45f4f404846040516103e391815260200190565b60405180910390a45050505050565b60006020828403121561040457600080fd5b5035919050565b60006020828403121561041d57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461044157600080fd5b9392505050565b81810381811115610482577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561049a57600080fd5b5051919050565b6000602082840312156104b357600080fd5b8151801515811461044157600080fdfea2646970667358221220beceeef332c731595ea3ed6b8a05d6adc8a5d2a7e13c45c5723c0028bf05648064736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063efef39a11461003b578063fe315a1314610050575b600080fd5b61004e6100493660046103f2565b610139565b005b61012061005e36600461040b565b60028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616845294815284832085516101608101875281548152600182015481840152948101548587015260038101546060860152600481015460808601529182015460a0850152600682015460c0850152600782015460e0850152600882015461010085015260098201546101208501819052600a9092015460ff16151561014090940193909352808252601890925291909120549091565b6040805192835260208301919091520160405180910390f35b601b546002546000818152600560209081526040808320338452909152902073ffffffffffffffffffffffffffffffffffffffff90921691831580610182575080600901548411155b156101b9576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600981015460009081526017602052604080822054868352908220546101df9190610448565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152909150819073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa15801561024e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102729190610488565b10156102aa576040517f0289a60100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526004602052604090206002015442106102f4576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600982018590556040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8516906323b872dd906064016020604051808303816000875af1158015610374573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039891906104a1565b50843373ffffffffffffffffffffffffffffffffffffffff16847fea32e0bbe6b44ae07c7113eff6123c3921029d514dc3383bfd3868da45f4f404846040516103e391815260200190565b60405180910390a45050505050565b60006020828403121561040457600080fd5b5035919050565b60006020828403121561041d57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461044157600080fd5b9392505050565b81810381811115610482577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60006020828403121561049a57600080fd5b5051919050565b6000602082840312156104b357600080fd5b8151801515811461044157600080fdfea2646970667358221220beceeef332c731595ea3ed6b8a05d6adc8a5d2a7e13c45c5723c0028bf05648064736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b5061091b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063675f4b7614610046578063efef39a11461006c578063fe315a1314610081575b600080fd5b61005961005436600461076f565b610166565b6040519081526020015b60405180910390f35b61007f61007a366004610799565b6102c5565b005b61015161008f3660046107b2565b60028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616845294815284832085516101608101875281548152600182015481840152948101548587015260038101546060860152600481015460808601529182015460a0850152600682015460c0850152600782015460e0850152600882015461010085015260098201546101208501819052600a9092015460ff16151561014090940193909352808252601290925291909120549091565b60408051928352602083019190915201610063565b6000818152601160209081526040808320546002548085526005845282852073ffffffffffffffffffffffffffffffffffffffff88168652845282852081865260049094529184209092908515806101c2575081600901548611155b806101cb575083155b15610202576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600982015460009081526011602052604090205461022090856107fc565b94504281600201541161025f576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6212750081600101544261027391906107fc565b1061028a5761028360028661080f565b94506102bb565b62093a8081600101544261029e91906107fc565b106102bb576102ae60048661080f565b6102b890866107fc565b94505b5050505092915050565b600081815260116020908152604080832054601954600254808652600585528386203387528552838620818752600490955292909420909373ffffffffffffffffffffffffffffffffffffffff169290851580610326575081600901548611155b8061032f575084155b15610366576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428160020154116103a3576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103af3388610166565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152909150819073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610442919061084a565b101561047a576040517f0289a60100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104838161056a565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8616906323b872dd906064016020604051808303816000875af11580156104fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105209190610863565b50600983018790556040518181528790339086907fea32e0bbe6b44ae07c7113eff6123c3921029d514dc3383bfd3868da45f4f4049060200160405180910390a450505050505050565b6000806013018054806020026020016040519081016040528092919081815260200182805480156105d157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116105a6575b5050505050905060008060140180548060200260200160405190810160405280929190818152602001828054801561062857602002820191906000526020600020905b815481526020019060010190808311610614575b505050505090506000825190508151811461066f576040517fac9b143300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561071d57600061069f868584815181106106925761069261088c565b6020026020010151610724565b905080600060100160008785815181106106bb576106bb61088c565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff9081168352828201939093526040918201600090812060195490941681529290528120805490919061070f9084906108bb565b909155505050600101610672565b5050505050565b600061271061073383856108ce565b61073d919061080f565b90505b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461076a57600080fd5b919050565b6000806040838503121561078257600080fd5b61078b83610746565b946020939093013593505050565b6000602082840312156107ab57600080fd5b5035919050565b6000602082840312156107c457600080fd5b61073d82610746565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610740576107406107cd565b600082610845577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561085c57600080fd5b5051919050565b60006020828403121561087557600080fd5b8151801515811461088557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115610740576107406107cd565b8082028115828204841417610740576107406107cd56fea264697066735822122040e9f993341ab255cf589a16f2bfcfc747fbe9f7437ee081ec4668700b5f570264736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063675f4b7614610046578063efef39a11461006c578063fe315a1314610081575b600080fd5b61005961005436600461076f565b610166565b6040519081526020015b60405180910390f35b61007f61007a366004610799565b6102c5565b005b61015161008f3660046107b2565b60028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616845294815284832085516101608101875281548152600182015481840152948101548587015260038101546060860152600481015460808601529182015460a0850152600682015460c0850152600782015460e0850152600882015461010085015260098201546101208501819052600a9092015460ff16151561014090940193909352808252601290925291909120549091565b60408051928352602083019190915201610063565b6000818152601160209081526040808320546002548085526005845282852073ffffffffffffffffffffffffffffffffffffffff88168652845282852081865260049094529184209092908515806101c2575081600901548611155b806101cb575083155b15610202576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600982015460009081526011602052604090205461022090856107fc565b94504281600201541161025f576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6212750081600101544261027391906107fc565b1061028a5761028360028661080f565b94506102bb565b62093a8081600101544261029e91906107fc565b106102bb576102ae60048661080f565b6102b890866107fc565b94505b5050505092915050565b600081815260116020908152604080832054601954600254808652600585528386203387528552838620818752600490955292909420909373ffffffffffffffffffffffffffffffffffffffff169290851580610326575081600901548611155b8061032f575084155b15610366576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428160020154116103a3576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103af3388610166565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152909150819073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610442919061084a565b101561047a576040517f0289a60100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104838161056a565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8616906323b872dd906064016020604051808303816000875af11580156104fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105209190610863565b50600983018790556040518181528790339086907fea32e0bbe6b44ae07c7113eff6123c3921029d514dc3383bfd3868da45f4f4049060200160405180910390a450505050505050565b6000806013018054806020026020016040519081016040528092919081815260200182805480156105d157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116105a6575b5050505050905060008060140180548060200260200160405190810160405280929190818152602001828054801561062857602002820191906000526020600020905b815481526020019060010190808311610614575b505050505090506000825190508151811461066f576040517fac9b143300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561071d57600061069f868584815181106106925761069261088c565b6020026020010151610724565b905080600060100160008785815181106106bb576106bb61088c565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff9081168352828201939093526040918201600090812060195490941681529290528120805490919061070f9084906108bb565b909155505050600101610672565b5050505050565b600061271061073383856108ce565b61073d919061080f565b90505b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461076a57600080fd5b919050565b6000806040838503121561078257600080fd5b61078b83610746565b946020939093013593505050565b6000602082840312156107ab57600080fd5b5035919050565b6000602082840312156107c457600080fd5b61073d82610746565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610740576107406107cd565b600082610845577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561085c57600080fd5b5051919050565b60006020828403121561087557600080fd5b8151801515811461088557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115610740576107406107cd565b8082028115828204841417610740576107406107cd56fea264697066735822122040e9f993341ab255cf589a16f2bfcfc747fbe9f7437ee081ec4668700b5f570264736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -99,7 +128,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0x924b44ddFc90Cc8354bF9182849F5eaeE64e2351" + "address": "0x51bdc4B651764384cC94772EE75858Ef80Df046B" }, "hardhat": { "artifact": { diff --git a/deployments/OwnershipFacet.json b/deployments/OwnershipFacet.json index 3690084..0ba6c66 100644 --- a/deployments/OwnershipFacet.json +++ b/deployments/OwnershipFacet.json @@ -56,17 +56,17 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610279806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063f2fde38b1461006c575b600080fd5b610043610081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007f61007a366004610206565b6100c6565b005b60006100c17fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b6100ce6100da565b6100d78161014c565b50565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461014a576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60006020828403121561021857600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461023c57600080fd5b939250505056fea2646970667358221220affce807ff96489143dff38247e51b574bafeff2102a0616906d7deb68d588fb64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063f2fde38b1461006c575b600080fd5b610043610081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007f61007a366004610206565b6100c6565b005b60006100c17fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b6100ce6100da565b6100d78161014c565b50565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461014a576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60006020828403121561021857600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461023c57600080fd5b939250505056fea2646970667358221220affce807ff96489143dff38247e51b574bafeff2102a0616906d7deb68d588fb64736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b50610279806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063f2fde38b1461006c575b600080fd5b610043610081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007f61007a366004610206565b6100c6565b005b60006100c17fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b6100ce6100da565b6100d78161014c565b50565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461014a576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60006020828403121561021857600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461023c57600080fd5b939250505056fea2646970667358221220644c35e9c8aab8f5ad10908a5cef6c01db0f0fe0ded158947d5ecf48df354c5464736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80638da5cb5b1461003b578063f2fde38b1461006c575b600080fd5b610043610081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007f61007a366004610206565b6100c6565b005b60006100c17fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b6100ce6100da565b6100d78161014c565b50565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff16331461014a576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c132080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60006020828403121561021857600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461023c57600080fd5b939250505056fea2646970667358221220644c35e9c8aab8f5ad10908a5cef6c01db0f0fe0ded158947d5ecf48df354c5464736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, "options": { "args": [], "log": true, - "skipIfAlreadyDeployed": false + "skipIfAlreadyDeployed": true }, - "address": "0x738839153C291e67656094c0C745F7b9AfEaa444" + "address": "0x71a882132249EF8ED2cA12Dd2b8Db55B43e7C24a" }, "hardhat": { "artifact": { diff --git a/deployments/PausationFacet.json b/deployments/PausationFacet.json index 70f3f7c..3c2c27f 100644 --- a/deployments/PausationFacet.json +++ b/deployments/PausationFacet.json @@ -48,17 +48,17 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506101f9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80633f4ba83a146100465780635c975abb146100505780638456cb591461006a575b600080fd5b61004e610072565b005b60015460ff16604051901515815260200160405180910390f35b61004e6100e0565b61007a610151565b60015460ff166100b6576040517f73445b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6100e8610151565b60015460ff1615610125576040517f7859166400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101c1576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b56fea2646970667358221220229ba32873f355f6c676c7c7849160330d8205c03b5a4d898271a1c42238d88564736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633f4ba83a146100465780635c975abb146100505780638456cb591461006a575b600080fd5b61004e610072565b005b60015460ff16604051901515815260200160405180910390f35b61004e6100e0565b61007a610151565b60015460ff166100b6576040517f73445b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6100e8610151565b60015460ff1615610125576040517f7859166400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101c1576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b56fea2646970667358221220229ba32873f355f6c676c7c7849160330d8205c03b5a4d898271a1c42238d88564736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b506101f9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80633f4ba83a146100465780635c975abb146100505780638456cb591461006a575b600080fd5b61004e610072565b005b60015460ff16604051901515815260200160405180910390f35b61004e6100e0565b61007a610151565b60015460ff166100b6576040517f73445b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6100e8610151565b60015460ff1615610125576040517f7859166400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101c1576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b56fea2646970667358221220993ab0929e9f4f1176ab40db2b06179c0bd75f2e98859abbabcd45fda7e0afa364736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633f4ba83a146100465780635c975abb146100505780638456cb591461006a575b600080fd5b61004e610072565b005b60015460ff16604051901515815260200160405180910390f35b61004e6100e0565b61007a610151565b60015460ff166100b6576040517f73445b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6100e8610151565b60015460ff1615610125576040517f7859166400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101c1576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b56fea2646970667358221220993ab0929e9f4f1176ab40db2b06179c0bd75f2e98859abbabcd45fda7e0afa364736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, "options": { "args": [], "log": true, - "skipIfAlreadyDeployed": false + "skipIfAlreadyDeployed": true }, - "address": "0xb91A405ae45fD9915D302748439Fc243241237F8" + "address": "0xC307958eFE78D781ec1B4E3B96FfAb7E33C6ac24" }, "hardhat": { "artifact": { diff --git a/deployments/UnlockFacet.json b/deployments/UnlockFacet.json index f409467..3099f65 100644 --- a/deployments/UnlockFacet.json +++ b/deployments/UnlockFacet.json @@ -83,8 +83,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506106b1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636198e3391461003b5780636e99d52f14610050575b600080fd5b61004e610049366004610549565b61006c565b005b61005a6203f48081565b60405190815260200160405180910390f35b6002805460008181526005602090815260408083203384528252808320848452600490925290912092830154600782015492939192156100d8576040517fc7c233de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254851115610113576040517f3731776200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61011f85828585610248565b6000808061012e6000336102e5565b60ff1691509150811561014d5760008181526007602052604090205492505b600654600061015c8a8361042a565b90506101678161044c565b60006127106101796203f48088610591565b61018391906105a8565b6101906203f480426105e3565b61019a91906105f6565b90508681106101d5576040517ff1ddec3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101df828c6105f6565b8960060160008282546101f291906105e3565b909155505060078901819055604080518c81526020810184905233918c917f264527c9df24015c81d07cee6ed0aaa3cb7dae31d37f68c16c15c9f8f89fba7b910160405180910390a35050505050505050505050565b60006201518061025842866105f6565b61026291906105a8565b90508483600001600082825461027891906105f6565b9091555061028890508186610591565b83600201600082825461029b91906105f6565b92505081905550848260050160008282546102b691906105f6565b909155506102c690508186610591565b8260070160008282546102d991906105f6565b90915550505050505050565b601c8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190610609565b90508015610421576040517f53f96df2000000000000000000000000000000000000000000000000000000008152600481018290526001945073ffffffffffffffffffffffffffffffffffffffff8316906353f96df290602401602060405180830381865afa1580156103fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041e9190610622565b92505b50509250929050565b60006127106104398385610591565b61044391906105a8565b90505b92915050565b600d54600c5414610489576040517f8867301300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c5460005b818110156105445760006104c3846000600d0184815481106104b3576104b361064c565b906000526020600020015461042a565b9050806000601601600080600c0185815481106104e2576104e261064c565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220601954909416825292909252812080549091906105369084906105e3565b90915550505060010161048f565b505050565b60006020828403121561055b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761044657610446610562565b6000826105de577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018082111561044657610446610562565b8181038181111561044657610446610562565b60006020828403121561061b57600080fd5b5051919050565b60006020828403121561063457600080fd5b815160ff8116811461064557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220a3d83a9ae701b6f34058dd65c4f29d1e41c4b02edde46e7d61d5559cbbb5da4f64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80636198e3391461003b5780636e99d52f14610050575b600080fd5b61004e610049366004610549565b61006c565b005b61005a6203f48081565b60405190815260200160405180910390f35b6002805460008181526005602090815260408083203384528252808320848452600490925290912092830154600782015492939192156100d8576040517fc7c233de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254851115610113576040517f3731776200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61011f85828585610248565b6000808061012e6000336102e5565b60ff1691509150811561014d5760008181526007602052604090205492505b600654600061015c8a8361042a565b90506101678161044c565b60006127106101796203f48088610591565b61018391906105a8565b6101906203f480426105e3565b61019a91906105f6565b90508681106101d5576040517ff1ddec3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101df828c6105f6565b8960060160008282546101f291906105e3565b909155505060078901819055604080518c81526020810184905233918c917f264527c9df24015c81d07cee6ed0aaa3cb7dae31d37f68c16c15c9f8f89fba7b910160405180910390a35050505050505050505050565b60006201518061025842866105f6565b61026291906105a8565b90508483600001600082825461027891906105f6565b9091555061028890508186610591565b83600201600082825461029b91906105f6565b92505081905550848260050160008282546102b691906105f6565b909155506102c690508186610591565b8260070160008282546102d991906105f6565b90915550505050505050565b601c8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190610609565b90508015610421576040517f53f96df2000000000000000000000000000000000000000000000000000000008152600481018290526001945073ffffffffffffffffffffffffffffffffffffffff8316906353f96df290602401602060405180830381865afa1580156103fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041e9190610622565b92505b50509250929050565b60006127106104398385610591565b61044391906105a8565b90505b92915050565b600d54600c5414610489576040517f8867301300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c5460005b818110156105445760006104c3846000600d0184815481106104b3576104b361064c565b906000526020600020015461042a565b9050806000601601600080600c0185815481106104e2576104e261064c565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409283018220601954909416825292909252812080549091906105369084906105e3565b90915550505060010161048f565b505050565b60006020828403121561055b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761044657610446610562565b6000826105de577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018082111561044657610446610562565b8181038181111561044657610446610562565b60006020828403121561061b57600080fd5b5051919050565b60006020828403121561063457600080fd5b815160ff8116811461064557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220a3d83a9ae701b6f34058dd65c4f29d1e41c4b02edde46e7d61d5559cbbb5da4f64736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b506106b7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636198e3391461003b5780636e99d52f14610050575b600080fd5b61004e610049366004610579565b61006c565b005b61005a6203f48081565b60405190815260200160405180910390f35b6002805460008181526005602090815260408083203384528252808320848452600490925290912092830154600782015492939192156100d8576040517fc7c233de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254851115610113576040517f3731776200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61011f85828585610248565b6000808061012e6000336102e5565b60ff1691509150811561014d5760008181526007602052604090205492505b600654600061015c8a8361039d565b9050610167816103bf565b60006127106101796203f480886105c1565b61018391906105d8565b6101906203f48042610613565b61019a9190610626565b90508681106101d5576040517ff1ddec3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101df828c610626565b8960060160008282546101f29190610613565b909155505060078901819055604080518c81526020810184905233918c917f264527c9df24015c81d07cee6ed0aaa3cb7dae31d37f68c16c15c9f8f89fba7b910160405180910390a35050505050505050505050565b6000620151806102584286610626565b61026291906105d8565b9050848360000160008282546102789190610626565b90915550610288905081866105c1565b83600201600082825461029b9190610626565b92505081905550848260050160008282546102b69190610626565b909155506102c6905081866105c1565b8260070160008282546102d99190610626565b90915550505050505050565b601a8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190610639565b905080156103945760019350600092505b50509250929050565b60006127106103ac83856105c1565b6103b691906105d8565b90505b92915050565b60008060090180548060200260200160405190810160405280929190818152602001828054801561042657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116103fb575b50505050509050600080600a0180548060200260200160405190810160405280929190818152602001828054801561047d57602002820191906000526020600020905b815481526020019060010190808311610469575b50505050509050600082519050815181146104c4576040517f8867301300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156105725760006104f4868584815181106104e7576104e7610652565b602002602001015161039d565b9050806000601001600087858151811061051057610510610652565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409182016000908120601754909416815292905281208054909190610564908490610613565b9091555050506001016104c7565b5050505050565b60006020828403121561058b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176103b9576103b9610592565b60008261060e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156103b9576103b9610592565b818103818111156103b9576103b9610592565b60006020828403121561064b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220518c44086e5ed5c7474cae50e537dd7b66d2f0f520948168b90a10d70015f3eb64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80636198e3391461003b5780636e99d52f14610050575b600080fd5b61004e610049366004610579565b61006c565b005b61005a6203f48081565b60405190815260200160405180910390f35b6002805460008181526005602090815260408083203384528252808320848452600490925290912092830154600782015492939192156100d8576040517fc7c233de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254851115610113576040517f3731776200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61011f85828585610248565b6000808061012e6000336102e5565b60ff1691509150811561014d5760008181526007602052604090205492505b600654600061015c8a8361039d565b9050610167816103bf565b60006127106101796203f480886105c1565b61018391906105d8565b6101906203f48042610613565b61019a9190610626565b90508681106101d5576040517ff1ddec3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101df828c610626565b8960060160008282546101f29190610613565b909155505060078901819055604080518c81526020810184905233918c917f264527c9df24015c81d07cee6ed0aaa3cb7dae31d37f68c16c15c9f8f89fba7b910160405180910390a35050505050505050505050565b6000620151806102584286610626565b61026291906105d8565b9050848360000160008282546102789190610626565b90915550610288905081866105c1565b83600201600082825461029b9190610626565b92505081905550848260050160008282546102b69190610626565b909155506102c6905081866105c1565b8260070160008282546102d99190610626565b90915550505050505050565b601a8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190610639565b905080156103945760019350600092505b50509250929050565b60006127106103ac83856105c1565b6103b691906105d8565b90505b92915050565b60008060090180548060200260200160405190810160405280929190818152602001828054801561042657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116103fb575b50505050509050600080600a0180548060200260200160405190810160405280929190818152602001828054801561047d57602002820191906000526020600020905b815481526020019060010190808311610469575b50505050509050600082519050815181146104c4576040517f8867301300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156105725760006104f4868584815181106104e7576104e7610652565b602002602001015161039d565b9050806000601001600087858151811061051057610510610652565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409182016000908120601754909416815292905281208054909190610564908490610613565b9091555050506001016104c7565b5050505050565b60006020828403121561058b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176103b9576103b9610592565b60008261060e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156103b9576103b9610592565b818103818111156103b9576103b9610592565b60006020828403121561064b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220518c44086e5ed5c7474cae50e537dd7b66d2f0f520948168b90a10d70015f3eb64736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -93,7 +93,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0xe263a2a3B66308655f1571c340fcffD444Be75f3" + "address": "0x60B3cd74058FE140a6D3EE244A3D77a50d100572" }, "hardhat": { "artifact": { diff --git a/deployments/WithdrawFacet.json b/deployments/WithdrawFacet.json index 135908c..f7a7198 100644 --- a/deployments/WithdrawFacet.json +++ b/deployments/WithdrawFacet.json @@ -48,8 +48,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610245806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80636fcd112b14610030575b600080fd5b61003861003a565b005b336000818152600b6020908152604080832054808452600583528184208585529092528220600681015460078201549293919290918290036100a8576040517f1138da8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428111156100e2576040517f6a3fb10500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006840181905560078401556019546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018d91906101e6565b508473ffffffffffffffffffffffffffffffffffffffff16847fb43a979cf5312add838538436575cdc00ab42ae32fed507f6447ec4658acbe85846040516101d791815260200190565b60405180910390a35050505050565b6000602082840312156101f857600080fd5b8151801515811461020857600080fd5b939250505056fea26469706673582212205bfd0e9b469678294db1020ea214974b1266815e644ccb7a29bcd98a37afa60864736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80636fcd112b14610030575b600080fd5b61003861003a565b005b336000818152600b6020908152604080832054808452600583528184208585529092528220600681015460078201549293919290918290036100a8576040517f1138da8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428111156100e2576040517f6a3fb10500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006840181905560078401556019546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018d91906101e6565b508473ffffffffffffffffffffffffffffffffffffffff16847fb43a979cf5312add838538436575cdc00ab42ae32fed507f6447ec4658acbe85846040516101d791815260200190565b60405180910390a35050505050565b6000602082840312156101f857600080fd5b8151801515811461020857600080fd5b939250505056fea26469706673582212205bfd0e9b469678294db1020ea214974b1266815e644ccb7a29bcd98a37afa60864736f6c63430008110033", + "bytecode": "0x608060405234801561001057600080fd5b50610245806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80636fcd112b14610030575b600080fd5b61003861003a565b005b33600081815260086020908152604080832054808452600583528184208585529092528220600681015460078201549293919290918290036100a8576040517f1138da8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428111156100e2576040517f6a3fb10500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006840181905560078401556017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018d91906101e6565b508473ffffffffffffffffffffffffffffffffffffffff16847fb43a979cf5312add838538436575cdc00ab42ae32fed507f6447ec4658acbe85846040516101d791815260200190565b60405180910390a35050505050565b6000602082840312156101f857600080fd5b8151801515811461020857600080fd5b939250505056fea2646970667358221220e55ccbbe089f538220d6f8c0201126a45b6901bf9a007237645bc76ed1c429bb64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80636fcd112b14610030575b600080fd5b61003861003a565b005b33600081815260086020908152604080832054808452600583528184208585529092528220600681015460078201549293919290918290036100a8576040517f1138da8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428111156100e2576040517f6a3fb10500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006840181905560078401556017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018d91906101e6565b508473ffffffffffffffffffffffffffffffffffffffff16847fb43a979cf5312add838538436575cdc00ab42ae32fed507f6447ec4658acbe85846040516101d791815260200190565b60405180910390a35050505050565b6000602082840312156101f857600080fd5b8151801515811461020857600080fd5b939250505056fea2646970667358221220e55ccbbe089f538220d6f8c0201126a45b6901bf9a007237645bc76ed1c429bb64736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -58,7 +58,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0xFFa49d87CC6c6EB5044657c9257E1a0E3d4258Fd" + "address": "0x0be993dA67E862da6179640aDEBEE36dc4C028F9" }, "hardhat": { "artifact": { diff --git a/hardhat.config.ts b/hardhat.config.ts index 86c74b2..32d6593 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -9,6 +9,8 @@ import '@nomicfoundation/hardhat-toolbox' import './tasks/verify' import './tasks/automatedClaim' import './tasks/season' +import './tasks/startSeason' +import './tasks/diamondInfo' import './tasks/admin' import { formatUnits, parseUnits } from 'ethers' diff --git a/scripts/initDynamicPricing.ts b/scripts/initDynamicPricing.ts new file mode 100644 index 0000000..da82e39 --- /dev/null +++ b/scripts/initDynamicPricing.ts @@ -0,0 +1,54 @@ +import { ethers, network } from 'hardhat' +import LiquidMiningDiamond from '../deployments/LiquidMiningDiamond.json' +import { logTx } from '../utils' + +const BASE_FEES = [ + 0, // Tier 0 + 0.5 * 1e6, // Tier 1 + 1 * 1e6, // Tier 2 + 2 * 1e6, // Tier 3 + 4 * 1e6, // Tier 4 + 8 * 1e6, // Tier 5 + 15 * 1e6, // Tier 6 + 30 * 1e6, // Tier 7 + 50 * 1e6, // Tier 8 + 75 * 1e6, // Tier 9 + 100 * 1e6, // Tier 10 +] + +async function main() { + const diamondAddress = + LiquidMiningDiamond[network.name as keyof typeof LiquidMiningDiamond] + .address + + console.log(`💎 Diamond: ${diamondAddress} on ${network.name}`) + + const manager = await ethers.getContractAt( + 'DiamondManagerFacet', + diamondAddress + ) + + // Set base fees + console.log('⏳ Setting base mining pass fees...') + const baseFeeTx = await manager.setBaseMiningPassFees(BASE_FEES) + await logTx(baseFeeTx) + + // Set floor + console.log('⏳ Setting mining pass fee floor to 25%...') + const floorTx = await manager.setMiningPassFeeFloor(2500) + await logTx(floorTx) + + // Verify + const baseFee10 = await manager.getBaseMiningPassTierFee(10) + const floorBps = await manager.getMiningPassFeeFloorBps() + console.log(`\n✅ Verified:`) + console.log(` Base fee tier 10: $${Number(baseFee10) / 1e6}`) + console.log(` Floor: ${Number(floorBps) / 100}%`) +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) diff --git a/src/facets/DiamondManagerFacet.sol b/src/facets/DiamondManagerFacet.sol index 142c61f..183b35b 100644 --- a/src/facets/DiamondManagerFacet.sol +++ b/src/facets/DiamondManagerFacet.sol @@ -41,6 +41,7 @@ contract DiamondManagerFacet { event SeasonEnded(uint256 indexed seasonId, uint256 rewardTokenDistributed); event MiningPassFeeReceiversSet(address[] receivers, uint256[] proportion); event MiningPassFeesUpdated(uint256[] fees); + event BaseMiningPassFeesUpdated(uint256[] fees); event MiningPassFeeFloorUpdated(uint256 floorBps); modifier onlyOwner() { @@ -184,6 +185,25 @@ contract DiamondManagerFacet { emit MiningPassFeesUpdated(fees); } + /// @notice Update base mining pass fees for all tiers + /// @dev Base fees are used as the reference for floor price calculation + /// @param fees Array of 11 base fees for tiers 0-10 (in USDC with 6 decimals) + function setBaseMiningPassFees(uint256[] calldata fees) external onlyOwner { + if (fees.length != 11) { + revert DiamondManagerFacet__Invalid_Input(); + } + + for (uint256 i; i < 11;) { + s.baseMiningPassTierToFee[i] = fees[i]; + + unchecked { + i++; + } + } + + emit BaseMiningPassFeesUpdated(fees); + } + /// @notice Update the floor price percentage for mining pass fees /// @param floorBps Floor price in basis points (e.g., 2500 = 25%) function setMiningPassFeeFloor(uint256 floorBps) external onlyOwner { diff --git a/src/libraries/AppStorage.sol b/src/libraries/AppStorage.sol index c65667f..c2e93b7 100644 --- a/src/libraries/AppStorage.sol +++ b/src/libraries/AppStorage.sol @@ -32,67 +32,82 @@ struct AppStorage { ///////////////////// /// AUTHORIZATION /// ///////////////////// - mapping(address => bool) authorized; + mapping(address => bool) authorized; // slot 0 ///////////////// /// PAUSATION /// ///////////////// - bool paused; + bool paused; // slot 1 ////////////// /// SEASON /// ////////////// - uint256 currentSeasonId; - uint256 seasonsCount; - mapping(uint256 => Season) seasons; + uint256 currentSeasonId; // slot 2 + uint256 seasonsCount; // slot 3 + mapping(uint256 => Season) seasons; // slot 4 // nested mapping: seasonId => userAddress => UserData - mapping(uint256 => mapping(address => UserData)) usersData; + mapping(uint256 => mapping(address => UserData)) usersData; // slot 5 /////////////// /// UNLOCK /// /////////////// - uint256 unlockFee; + uint256 unlockFee; // slot 6 // mapping: tier => discount percentage - mapping(uint256 => uint256) unlockTimestampDiscountForStratosphereMembers; + mapping(uint256 => uint256) unlockTimestampDiscountForStratosphereMembers; // slot 7 + /// @dev deprecated - preserved for storage layout compatibility with 14f06c0 deployment + mapping(uint256 => uint256) __deprecated_unlockFeeDiscount; // slot 8 + mapping(uint256 => uint256) __deprecated_depositDiscount; // slot 9 + mapping(uint256 => uint256) __deprecated_restakeDiscount; // slot 10 // mapping: user => lastSeasonParticipated - mapping(address => uint256) addressToLastSeasonId; - address[] unlockFeeReceivers; - uint256[] unlockFeeReceiversShares; + mapping(address => uint256) addressToLastSeasonId; // slot 11 + address[] unlockFeeReceivers; // slot 12 + uint256[] unlockFeeReceiversShares; // slot 13 //////////////// /// BOOST /// //////////////// - uint256 boostForNonStratMembers; + uint256 boostForNonStratMembers; // slot 14 //mapping: level => USDC fee - mapping(uint256 => uint256) boostLevelToFee; + mapping(uint256 => uint256) boostLevelToFee; // slot 15 // nested mapping: tier => boostlevel => boost enhance points - mapping(uint256 => mapping(uint256 => uint256)) boostPercentFromTierToLevel; - address[] boostFeeReceivers; - uint256[] boostFeeReceiversShares; + mapping(uint256 => mapping(uint256 => uint256)) boostPercentFromTierToLevel; // slot 16 + address[] boostFeeReceivers; // slot 17 + uint256[] boostFeeReceiversShares; // slot 18 + /////////////// + /// RESTAKE (deprecated) /// + /////////////// + /// @dev deprecated - preserved for storage layout compatibility with 14f06c0 deployment + uint256 __deprecated_restakeFee; // slot 19 + mapping(uint256 => mapping(address => uint256)) __deprecated_claimAmounts; // slot 20 + mapping(uint256 => uint256) __deprecated_totalClaimAmounts; // slot 21 //////////////// /// WITHDRAW /// //////////////// // nested mapping: userAddress => tokenAddress => amount - mapping(address => mapping(address => uint256)) pendingWithdrawals; + mapping(address => mapping(address => uint256)) pendingWithdrawals; // slot 22 /////////////////// /// MINING PASS /// /////////////////// - mapping(uint256 => uint256) miningPassTierToFee; - mapping(uint256 => uint256) miningPassTierToDepositLimit; - address[] miningPassFeeReceivers; - uint256[] miningPassFeeReceiversShares; - /// @dev Base fees (original fees set at deployment, used for floor price calculation) - mapping(uint256 => uint256) baseMiningPassTierToFee; - /// @dev Floor price percentage in basis points (e.g., 2500 = 25%) - uint256 miningPassFeeFloorBps; + //mapping: level => USDC fee + mapping(uint256 => uint256) miningPassTierToFee; // slot 23 + mapping(uint256 => uint256) miningPassTierToDepositLimit; // slot 24 /////////////// /// GENERAL /// /////////////// - address depositToken; - address rewardToken; - address feeToken; - address stratosphereAddress; - uint256 reentrancyGuardStatus; - address emissionsManager; + address depositToken; // slot 25 + address rewardToken; // slot 26 + address feeToken; // slot 27 + address stratosphereAddress; // slot 28 + uint256 reentrancyGuardStatus; // slot 29 + address emissionsManager; // slot 30 + ///////////////////////////////////////// + /// MINING PASS (extended) - appended /// + ///////////////////////////////////////// + address[] miningPassFeeReceivers; // slot 31 + uint256[] miningPassFeeReceiversShares; // slot 32 + /// @dev Base fees (original fees set at deployment, used for floor price calculation) + mapping(uint256 => uint256) baseMiningPassTierToFee; // slot 33 + /// @dev Floor price percentage in basis points (e.g., 2500 = 25%) + uint256 miningPassFeeFloorBps; // slot 34 ////////////////// /// AUTOMATION /// ////////////////// - address gelatoExecutor; - mapping(uint256 => bool) isSeasonClaimed; + address gelatoExecutor; // slot 35 + mapping(uint256 => bool) isSeasonClaimed; // slot 36 } diff --git a/tasks/diamondInfo.ts b/tasks/diamondInfo.ts new file mode 100644 index 0000000..b8cbb1a --- /dev/null +++ b/tasks/diamondInfo.ts @@ -0,0 +1,163 @@ +import { task } from 'hardhat/config' +import { formatEther, formatUnits } from 'ethers' +import LiquidMiningDiamond from '../deployments/LiquidMiningDiamond.json' + +task( + 'diamond:info', + 'Read and display all key parameters from the DiamondManagerFacet' +) + .addOptionalParam('user', 'Address to query user-specific data for') + .setAction(async ({ user }, { ethers, network }) => { + const diamondAddress = + LiquidMiningDiamond[network.name as keyof typeof LiquidMiningDiamond] + .address + + const dm = await ethers.getContractAt( + 'DiamondManagerFacet', + diamondAddress + ) + + console.log(`\n💎 Diamond: ${diamondAddress} (${network.name})`) + + // ── General ──────────────────────────────────────────────────────── + const stratAddress = await dm.getStratosphereAddress() + console.log(`\n═══ General ═══`) + console.log(` Stratosphere: ${stratAddress}`) + + // ── Current Season ───────────────────────────────────────────────── + const seasonId = await dm.getCurrentSeasonId() + const seasonData = await dm.getSeasonData(seasonId) + const seasonEnd = await dm.getSeasonEndTimestamp(seasonId) + const isClaimed = await dm.getSeasonIsClaimed(seasonId) + + const endDate = new Date(Number(seasonEnd) * 1000) + const now = new Date() + const daysLeft = Math.max( + 0, + Math.ceil((endDate.getTime() - now.getTime()) / 86400000) + ) + + console.log(`\n═══ Current Season (${seasonId}) ═══`) + console.log( + ` End: ${endDate.toISOString().split('T')[0]} (${daysLeft} days left)` + ) + console.log( + ` Rewards: ${formatEther(seasonData.rewardTokensToDistribute)} VAPE` + ) + console.log( + ` Reward Balance: ${formatEther(seasonData.rewardTokenBalance)} VAPE` + ) + console.log( + ` Total Deposits: ${formatEther(seasonData.totalDepositAmount)} VPND` + ) + console.log( + ` Total Points: ${formatEther(seasonData.totalPoints)}` + ) + console.log( + ` Total Claimed: ${formatEther(seasonData.totalClaimAmount)} VAPE` + ) + console.log(` Season Claimed: ${isClaimed}`) + + // ── Mining Pass Fees ─────────────────────────────────────────────── + const floorBps = await dm.getMiningPassFeeFloorBps() + + console.log(`\n═══ Mining Pass Fees (Floor: ${Number(floorBps) / 100}%) ═══`) + console.log( + 'Tier | Base Fee ($) | Current ($) | Floor ($) | Deposit Limit' + ) + console.log( + '-----|-------------|-------------|------------|------------------' + ) + + for (let i = 0; i <= 10; i++) { + const baseFee = await dm.getBaseMiningPassTierFee(i) + const currentFee = await dm.getMiningPassTierFee(i) + const floorFee = await dm.getMiningPassTierFloorFee(i) + const depositLimit = await dm.getMiningPassTierDepositLimit(i) + + const limitStr = + depositLimit === BigInt(2) ** BigInt(256) - BigInt(1) + ? 'Unlimited' + : `${formatEther(depositLimit)} VPND` + + console.log( + ` ${i.toString().padStart(2)} | ${(Number(baseFee) / 1e6).toFixed(2).padStart(11)} | ${(Number(currentFee) / 1e6).toFixed(2).padStart(11)} | ${(Number(floorFee) / 1e6).toFixed(2).padStart(10)} | ${limitStr}` + ) + } + + // ── Historical Seasons ───────────────────────────────────────────── + const numSeasons = Number(seasonId) + if (numSeasons > 1) { + console.log(`\n═══ Season History ═══`) + console.log( + 'Season | Rewards (VAPE) | Deposits (VPND) | Total Points' + ) + console.log( + '-------|----------------|-------------------|------------------' + ) + for ( + let i = Math.max(1, numSeasons - 4); + i <= numSeasons; + i++ + ) { + const sd = await dm.getSeasonData(i) + console.log( + ` ${i.toString().padStart(2)} | ${formatEther(sd.rewardTokensToDistribute).padStart(14)} | ${formatEther(sd.totalDepositAmount).padStart(17)} | ${formatEther(sd.totalPoints)}` + ) + } + } + + // ── User Data (optional) ─────────────────────────────────────────── + if (user) { + console.log(`\n═══ User: ${user} ═══`) + const userData = await dm.getUserDataForCurrentSeason(user) + const [depositAmount, depositTimestamp] = await dm.getUserDepositAmount( + user, + seasonId + ) + const [depositPoints, boostPoints] = await dm.getUserPoints( + user, + seasonId + ) + const claimedRewards = await dm.getUserClaimedRewards(user, seasonId) + const unlockAmount = await dm.getUnlockAmountOfUser(user, seasonId) + const unlockTimestamp = await dm.getUnlockTimestampOfUser(user, seasonId) + const restakeStatus = await dm.getWithdrawRestakeStatus(user, seasonId) + + console.log( + ` Deposit: ${formatEther(depositAmount)} VPND` + ) + console.log( + ` Deposit Points: ${formatEther(depositPoints)}` + ) + console.log( + ` Boost Points: ${formatEther(boostPoints)}` + ) + console.log( + ` Claimed Rewards: ${formatEther(claimedRewards)} VAPE` + ) + console.log( + ` Unlock Amount: ${formatEther(unlockAmount)} VPND` + ) + if (Number(unlockTimestamp) > 0) { + console.log( + ` Unlock Time: ${new Date(Number(unlockTimestamp) * 1000).toISOString()}` + ) + } + console.log(` Restake Status: ${restakeStatus}`) + + try { + const details = await dm.getCurrentSeasonUserDetails(user) + console.log( + ` Pool Share: ${(Number(details.poolShareBips) / 100).toFixed(2)}%` + ) + console.log( + ` Est. Rewards: ${formatEther(details.estimatedRewards)} VAPE` + ) + } catch { + // totalPoints may be 0 + } + } + + console.log('') + }) diff --git a/tasks/startSeason.ts b/tasks/startSeason.ts new file mode 100644 index 0000000..ad0f13d --- /dev/null +++ b/tasks/startSeason.ts @@ -0,0 +1,134 @@ +import { task } from 'hardhat/config' +import LiquidMiningDiamond from '../deployments/LiquidMiningDiamond.json' +import { calculateReward, getNextMonthTimestamp, logTx } from '../utils' + +const REFERENCE_VAPE_PRICE = 0.606 +const FLOOR_BPS = 2500 // 25% +const NUM_TIERS = 11 + +async function fetchVAPEPrice(): Promise { + const response = await fetch( + 'https://api.coingecko.com/api/v3/simple/price?ids=vaporfi&vs_currencies=usd' + ) + const data = (await response.json()) as { vaporfi?: { usd?: number } } + const price = data.vaporfi?.usd + if (!price) throw new Error('Failed to fetch VAPE price from CoinGecko') + return price +} + +function calculateDynamicFees( + baseFees: bigint[], + vapePrice: number, + floorBps: number +): bigint[] { + const multiplierBps = Math.floor((vapePrice / REFERENCE_VAPE_PRICE) * 10000) + + return baseFees.map((baseFee) => { + const floorFee = (baseFee * BigInt(floorBps)) / 10000n + const dynamicFee = (baseFee * BigInt(multiplierBps)) / 10000n + return dynamicFee > floorFee ? dynamicFee : floorFee + }) +} + +task( + 'season:start', + 'Update mining pass prices based on VAPE price, then start a new season' +) + .addOptionalParam('vapePrice', 'Override VAPE price (USD) instead of fetching') + .addOptionalParam('endTimestamp', 'Custom season end timestamp') + .addFlag('dryRun', 'Print what would happen without sending transactions') + .addFlag('skipClaim', 'Skip the claimTokensForSeason step (useful for testnet)') + .setAction(async ({ vapePrice, endTimestamp, dryRun, skipClaim }, { ethers, network }) => { + const diamondAddress = + LiquidMiningDiamond[network.name as keyof typeof LiquidMiningDiamond] + .address + + const DiamondManagerFacet = await ethers.getContractAt( + 'DiamondManagerFacet', + diamondAddress + ) + + // ── 1. Fetch VAPE price ────────────────────────────────────────── + const currentVAPEPrice = vapePrice + ? parseFloat(vapePrice) + : await fetchVAPEPrice() + + console.log(`\n💰 VAPE Price: $${currentVAPEPrice.toFixed(4)}`) + console.log( + `📐 Multiplier: ${((currentVAPEPrice / REFERENCE_VAPE_PRICE) * 100).toFixed(1)}% of reference ($${REFERENCE_VAPE_PRICE})` + ) + + // ── 2. Read base fees from contract ────────────────────────────── + const baseFees: bigint[] = [] + for (let i = 0; i < NUM_TIERS; i++) { + const fee = await DiamondManagerFacet.getBaseMiningPassTierFee(i) + baseFees.push(fee) + } + + // ── 3. Calculate dynamic fees ──────────────────────────────────── + const dynamicFees = calculateDynamicFees( + baseFees, + currentVAPEPrice, + FLOOR_BPS + ) + + console.log('\n📋 Mining Pass Fee Update:') + console.log('Tier | Base Fee ($) | New Fee ($) | Change') + console.log('-----|-------------|-------------|-------') + for (let i = 0; i < NUM_TIERS; i++) { + const base = Number(baseFees[i]) / 1e6 + const dynamic = Number(dynamicFees[i]) / 1e6 + const change = + base > 0 ? `${(((dynamic - base) / base) * 100).toFixed(0)}%` : '-' + console.log( + ` ${i.toString().padStart(2)} | ${base.toFixed(2).padStart(11)} | ${dynamic.toFixed(2).padStart(11)} | ${change}` + ) + } + + // ── 4. Calculate season rewards ────────────────────────────────── + const currentSeasonId = await DiamondManagerFacet.getCurrentSeasonId() + const nextSeasonId = Number(currentSeasonId) + 1 + const rewards = calculateReward(nextSeasonId) + const parsedRewards = ethers.parseEther(rewards.toString()) + const seasonEnd = endTimestamp + ? parseInt(endTimestamp) + : getNextMonthTimestamp() + + console.log(`\n🔄 Season ${nextSeasonId}:`) + console.log(` Rewards: ${rewards.toFixed(2)} VAPE`) + console.log( + ` End: ${new Date(seasonEnd * 1000).toISOString().split('T')[0]}` + ) + + if (dryRun) { + console.log('\n🏁 Dry run complete — no transactions sent.') + return + } + + // ── 5. Update mining pass fees ─────────────────────────────────── + console.log('\n⏳ Updating mining pass fees...') + const feesTx = await DiamondManagerFacet.setMiningPassFees(dynamicFees) + await logTx(feesTx) + console.log('✅ Mining pass fees updated') + + // ── 6. Start new season ────────────────────────────────────────── + console.log('⏳ Starting new season...') + const startTx = await DiamondManagerFacet.startNewSeasonWithEndTimestamp( + parsedRewards.toString(), + seasonEnd + ) + await logTx(startTx) + console.log('✅ New season started') + + // ── 7. Claim tokens for season ─────────────────────────────────── + if (skipClaim) { + console.log('⏭️ Skipping claimTokensForSeason (--skip-claim)') + } else { + console.log('⏳ Claiming VAPE tokens for season...') + const claimTx = await DiamondManagerFacet.claimTokensForSeason() + await logTx(claimTx) + console.log('✅ VAPE minted') + } + + console.log('\n🎉 All done!') + }) diff --git a/test/foundry/Facets/MiningPassDynamicPricing.t.sol b/test/foundry/Facets/MiningPassDynamicPricing.t.sol index 9cced2e..fb84f62 100644 --- a/test/foundry/Facets/MiningPassDynamicPricing.t.sol +++ b/test/foundry/Facets/MiningPassDynamicPricing.t.sol @@ -381,6 +381,59 @@ contract MiningPassDynamicPricingTest is DiamondTest { vm.stopPrank(); } + // ═══════════════════════════════════════════════════════════════════ + // SET BASE FEES TESTS + // ═══════════════════════════════════════════════════════════════════ + + function test_SetBaseMiningPassFees() public { + vm.startPrank(owner); + + uint256[] memory newBaseFees = new uint256[](11); + newBaseFees[0] = 0; + newBaseFees[1] = 1 * 1e6; + newBaseFees[2] = 2 * 1e6; + newBaseFees[3] = 4 * 1e6; + newBaseFees[4] = 8 * 1e6; + newBaseFees[5] = 16 * 1e6; + newBaseFees[6] = 30 * 1e6; + newBaseFees[7] = 60 * 1e6; + newBaseFees[8] = 100 * 1e6; + newBaseFees[9] = 150 * 1e6; + newBaseFees[10] = 200 * 1e6; + + diamondManagerFacet.setBaseMiningPassFees(newBaseFees); + + // Verify base fees updated + for (uint256 i; i < 11; i++) { + assertEq(diamondManagerFacet.getBaseMiningPassTierFee(i), newBaseFees[i]); + } + + // Floor fee should reflect new base + assertEq(diamondManagerFacet.getMiningPassTierFloorFee(10), 50 * 1e6); // 25% of $200 + + vm.stopPrank(); + } + + function test_SetBaseMiningPassFees_RevertIf_InvalidLength() public { + vm.startPrank(owner); + + uint256[] memory shortFees = new uint256[](5); + vm.expectRevert(DiamondManagerFacet__Invalid_Input.selector); + diamondManagerFacet.setBaseMiningPassFees(shortFees); + + vm.stopPrank(); + } + + function test_SetBaseMiningPassFees_RevertIf_NotOwner() public { + vm.startPrank(user); + + uint256[] memory newFees = new uint256[](11); + vm.expectRevert(DiamondManagerFacet__Not_Owner.selector); + diamondManagerFacet.setBaseMiningPassFees(newFees); + + vm.stopPrank(); + } + // ═══════════════════════════════════════════════════════════════════ // HELPERS // ═══════════════════════════════════════════════════════════════════ diff --git a/test/foundry/fork/FujiForkMiningPass.t.sol b/test/foundry/fork/FujiForkMiningPass.t.sol new file mode 100644 index 0000000..44ab2d8 --- /dev/null +++ b/test/foundry/fork/FujiForkMiningPass.t.sol @@ -0,0 +1,200 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.18; + +import "forge-std/Test.sol"; +import {IERC20} from "openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IDiamondCut} from "clouds/interfaces/IDiamondCut.sol"; +import {IDiamondLoupe} from "clouds/interfaces/IDiamondLoupe.sol"; +import {DiamondManagerFacet} from "src/facets/DiamondManagerFacet.sol"; +import {MiningPassFacet} from "src/facets/MiningPassFacet.sol"; + +/// @title FujiForkMiningPassTest +/// @notice Fork test against the real Fuji diamond to verify storage layout fix. +/// The diamond was deployed at commit 14f06c0 which placed GENERAL fields +/// (depositToken, rewardToken, feeToken, ...) at slots 25-30. A prior +/// upgrade shifted those fields causing feeToken (slot 25 in broken HEAD) +/// to read depositToken data (VPND). The fixed AppStorage restores the +/// original slot layout with deprecated gap fields. +contract FujiForkMiningPassTest is Test { + // ──── Real Fuji addresses ──── + address constant DIAMOND = 0xEd98549D4dE52811b3b417A717E3d74AC90F9Ffe; + address constant VPND = 0x096F22B7891DeA0e9340365Be2021eEa562D0b55; + address constant USDC = 0xeA42E3030ab1406a0b6aAd077Caa927673a2c302; + address constant VAPE = 0x0914aFfEbBAe91fB410A3Cd85a0C7AC740b030cF; + address constant STRATOSPHERE = 0x26b794235422e7c6f3ac6c717b10598C2a144203; + + DiamondManagerFacet diamond; + MiningPassFacet miningPass; + IDiamondLoupe loupe; + address owner; + address user; + + function setUp() public { + vm.createSelectFork("fuji"); + + diamond = DiamondManagerFacet(DIAMOND); + miningPass = MiningPassFacet(DIAMOND); + loupe = IDiamondLoupe(DIAMOND); + user = makeAddr("testUser"); + + // Read the owner from the OwnershipFacet + (bool ok, bytes memory data) = DIAMOND.staticcall(abi.encodeWithSignature("owner()")); + require(ok, "owner() call failed"); + owner = abi.decode(data, (address)); + } + + // ═══════════════════════════════════════════════════════════════════ + // STORAGE LAYOUT VERIFICATION + // ═══════════════════════════════════════════════════════════════════ + + /// @notice Verify raw storage slots 25-28 hold the original 14f06c0 token addresses + function test_Fork_VerifyStorageLayout() public { + address slot25 = address(uint160(uint256(vm.load(DIAMOND, bytes32(uint256(25)))))); + address slot26 = address(uint160(uint256(vm.load(DIAMOND, bytes32(uint256(26)))))); + address slot27 = address(uint160(uint256(vm.load(DIAMOND, bytes32(uint256(27)))))); + address slot28 = address(uint160(uint256(vm.load(DIAMOND, bytes32(uint256(28)))))); + + console.log("Raw storage:"); + console.log(" slot 25 (depositToken):", slot25); + console.log(" slot 26 (rewardToken):", slot26); + console.log(" slot 27 (feeToken):", slot27); + console.log(" slot 28 (stratosphere):", slot28); + + assertEq(slot25, VPND, "slot 25 should be VPND (depositToken)"); + assertEq(slot26, VAPE, "slot 26 should be VAPE (rewardToken)"); + assertEq(slot27, USDC, "slot 27 should be USDC (feeToken)"); + assertEq(slot28, STRATOSPHERE, "slot 28 should be stratosphere"); + } + + /// @notice After upgrading facets on the fork, feeToken should be USDC + function test_Fork_AfterUpgrade_FeeTokenIsUSDC() public { + _upgradeFacets(); + _reinitializeMiningPassData(); + + // feeToken at slot 27 = USDC (from original 14f06c0 init) + assertEq(diamond.getStratosphereAddress(), STRATOSPHERE, "stratosphere should be correct"); + + uint256 tier1Fee = diamond.getMiningPassTierFee(1); + console.log("Tier 1 fee:", tier1Fee); + assertTrue(tier1Fee > 0, "tier 1 fee should be non-zero after reinit"); + + uint256 floorBps = diamond.getMiningPassFeeFloorBps(); + assertEq(floorBps, 2500, "floor should be 2500 bps"); + } + + /// @notice Full end-to-end: upgrade, reinit, purchase mining pass — USDC spent, not VPND + function test_Fork_AfterUpgrade_PurchaseUsesUSDC() public { + _upgradeFacets(); + _reinitializeMiningPassData(); + _setupMiningPassFeeReceivers(); + _ensureActiveSeason(); + + uint256 fee = diamond.getMiningPassTierFee(1); + require(fee > 0, "fee is 0"); + console.log("Tier 1 fee:", fee); + + // Give user USDC and VPND + deal(USDC, user, fee * 10); + deal(VPND, user, fee * 10); + + uint256 usdcBefore = IERC20(USDC).balanceOf(user); + uint256 vpndBefore = IERC20(VPND).balanceOf(user); + + vm.startPrank(user); + IERC20(USDC).approve(DIAMOND, type(uint256).max); + IERC20(VPND).approve(DIAMOND, type(uint256).max); + miningPass.purchase(1); + vm.stopPrank(); + + uint256 usdcSpent = usdcBefore - IERC20(USDC).balanceOf(user); + uint256 vpndSpent = vpndBefore - IERC20(VPND).balanceOf(user); + + console.log("USDC spent:", usdcSpent); + console.log("VPND spent:", vpndSpent); + + assertEq(usdcSpent, fee, "USDC should be spent for the fee"); + assertEq(vpndSpent, 0, "VPND should NOT be spent"); + } + + // ═══════════════════════════════════════════════════════════════════ + // HELPERS + // ═══════════════════════════════════════════════════════════════════ + + /// @dev Deploy new facets (compiled with fixed AppStorage) and replace them + /// in the diamond. Uses the loupe to dynamically get all registered + /// selectors for each facet so we don't miss any. + function _upgradeFacets() internal { + DiamondManagerFacet newDMF = new DiamondManagerFacet(); + MiningPassFacet newMPF = new MiningPassFacet(); + + // Use the loupe to find existing facet addresses via known selectors + address oldDmfAddr = loupe.facetAddress(DiamondManagerFacet.setDepositToken.selector); + address oldMpfAddr = loupe.facetAddress(MiningPassFacet.purchase.selector); + + // Get ALL registered selectors for those facets + bytes4[] memory dmfSelectors = loupe.facetFunctionSelectors(oldDmfAddr); + bytes4[] memory mpfSelectors = loupe.facetFunctionSelectors(oldMpfAddr); + + console.log("DMF selectors to replace:", dmfSelectors.length); + console.log("MPF selectors to replace:", mpfSelectors.length); + + IDiamondCut.FacetCut[] memory cuts = new IDiamondCut.FacetCut[](2); + cuts[0] = IDiamondCut.FacetCut({ + facetAddress: address(newDMF), action: IDiamondCut.FacetCutAction.Replace, functionSelectors: dmfSelectors + }); + cuts[1] = IDiamondCut.FacetCut({ + facetAddress: address(newMPF), action: IDiamondCut.FacetCutAction.Replace, functionSelectors: mpfSelectors + }); + + vm.prank(owner); + IDiamondCut(DIAMOND).diamondCut(cuts, address(0), ""); + } + + function _reinitializeMiningPassData() internal { + uint256[] memory fees = new uint256[](11); + fees[0] = 0; + fees[1] = 0.5 * 1e6; // tier 1: 0.5 USDC + fees[2] = 1 * 1e6; + fees[3] = 2 * 1e6; + fees[4] = 4 * 1e6; + fees[5] = 8 * 1e6; + fees[6] = 15 * 1e6; + fees[7] = 30 * 1e6; + fees[8] = 50 * 1e6; + fees[9] = 75 * 1e6; + fees[10] = 100 * 1e6; + + vm.startPrank(owner); + diamond.setBaseMiningPassFees(fees); + diamond.setMiningPassFees(fees); + diamond.setMiningPassFeeFloor(2500); + vm.stopPrank(); + } + + function _setupMiningPassFeeReceivers() internal { + address[] memory receivers = new address[](1); + receivers[0] = makeAddr("feeReceiver"); + uint256[] memory shares = new uint256[](1); + shares[0] = 10000; // 100% + + vm.prank(owner); + diamond.setMiningPassFeeReceivers(receivers, shares); + } + + function _ensureActiveSeason() internal { + uint256 seasonId = diamond.getCurrentSeasonId(); + if (seasonId == 0) { + vm.prank(owner); + diamond.startNewSeasonWithEndTimestamp(1000 * 1e18, block.timestamp + 30 days); + return; + } + + // Read season end timestamp from storage (Season struct in mapping at slot 4) + bytes32 baseSlot = keccak256(abi.encode(seasonId, uint256(4))); + uint256 endTs = uint256(vm.load(DIAMOND, bytes32(uint256(baseSlot) + 2))); + if (endTs <= block.timestamp) { + vm.prank(owner); + diamond.startNewSeasonWithEndTimestamp(1000 * 1e18, block.timestamp + 30 days); + } + } +} diff --git a/test/foundry/utils/DiamondTest.sol b/test/foundry/utils/DiamondTest.sol index 5ff37df..79abea4 100644 --- a/test/foundry/utils/DiamondTest.sol +++ b/test/foundry/utils/DiamondTest.sol @@ -178,7 +178,7 @@ contract DiamondTest is Test { function setDiamondManagerFacet() private { DiamondManagerFacet diamondManager = new DiamondManagerFacet(); bytes4[] memory functionSelectors; - functionSelectors = new bytes4[](38); + functionSelectors = new bytes4[](39); functionSelectors[0] = diamondManager.setDepositToken.selector; functionSelectors[1] = diamondManager.setCurrentSeasonId.selector; functionSelectors[2] = diamondManager.setStratosphereAddress.selector; @@ -218,6 +218,7 @@ contract DiamondTest is Test { functionSelectors[35] = diamondManager.getMiningPassFeeFloorBps.selector; functionSelectors[36] = diamondManager.getAllMiningPassFees.selector; functionSelectors[37] = diamondManager.getMiningPassTierDepositLimit.selector; + functionSelectors[38] = diamondManager.setBaseMiningPassFees.selector; cut.push( IDiamondCut.FacetCut({ From eedfadb0463f301d3a3a4733158cc2bb3c84b251 Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Wed, 18 Feb 2026 14:22:51 +0530 Subject: [PATCH 3/7] fix: sync fuji slots to prod --- src/libraries/AppStorage.sol | 63 +++-- src/upgradeInitializers/FujiMigrationInit.sol | 219 +++++++++++++++++ test/foundry/fork/FujiForkMiningPass.t.sol | 220 ++++++++++-------- 3 files changed, 374 insertions(+), 128 deletions(-) create mode 100644 src/upgradeInitializers/FujiMigrationInit.sol diff --git a/src/libraries/AppStorage.sol b/src/libraries/AppStorage.sol index c2e93b7..1bcf2b7 100644 --- a/src/libraries/AppStorage.sol +++ b/src/libraries/AppStorage.sol @@ -51,63 +51,52 @@ struct AppStorage { uint256 unlockFee; // slot 6 // mapping: tier => discount percentage mapping(uint256 => uint256) unlockTimestampDiscountForStratosphereMembers; // slot 7 - /// @dev deprecated - preserved for storage layout compatibility with 14f06c0 deployment - mapping(uint256 => uint256) __deprecated_unlockFeeDiscount; // slot 8 - mapping(uint256 => uint256) __deprecated_depositDiscount; // slot 9 - mapping(uint256 => uint256) __deprecated_restakeDiscount; // slot 10 // mapping: user => lastSeasonParticipated - mapping(address => uint256) addressToLastSeasonId; // slot 11 - address[] unlockFeeReceivers; // slot 12 - uint256[] unlockFeeReceiversShares; // slot 13 + mapping(address => uint256) addressToLastSeasonId; // slot 8 + address[] unlockFeeReceivers; // slot 9 + uint256[] unlockFeeReceiversShares; // slot 10 //////////////// /// BOOST /// //////////////// - uint256 boostForNonStratMembers; // slot 14 + uint256 boostForNonStratMembers; // slot 11 //mapping: level => USDC fee - mapping(uint256 => uint256) boostLevelToFee; // slot 15 + mapping(uint256 => uint256) boostLevelToFee; // slot 12 // nested mapping: tier => boostlevel => boost enhance points - mapping(uint256 => mapping(uint256 => uint256)) boostPercentFromTierToLevel; // slot 16 - address[] boostFeeReceivers; // slot 17 - uint256[] boostFeeReceiversShares; // slot 18 - /////////////// - /// RESTAKE (deprecated) /// - /////////////// - /// @dev deprecated - preserved for storage layout compatibility with 14f06c0 deployment - uint256 __deprecated_restakeFee; // slot 19 - mapping(uint256 => mapping(address => uint256)) __deprecated_claimAmounts; // slot 20 - mapping(uint256 => uint256) __deprecated_totalClaimAmounts; // slot 21 + mapping(uint256 => mapping(uint256 => uint256)) boostPercentFromTierToLevel; // slot 13 + address[] boostFeeReceivers; // slot 14 + uint256[] boostFeeReceiversShares; // slot 15 //////////////// /// WITHDRAW /// //////////////// // nested mapping: userAddress => tokenAddress => amount - mapping(address => mapping(address => uint256)) pendingWithdrawals; // slot 22 + mapping(address => mapping(address => uint256)) pendingWithdrawals; // slot 16 /////////////////// /// MINING PASS /// /////////////////// //mapping: level => USDC fee - mapping(uint256 => uint256) miningPassTierToFee; // slot 23 - mapping(uint256 => uint256) miningPassTierToDepositLimit; // slot 24 + mapping(uint256 => uint256) miningPassTierToFee; // slot 17 + mapping(uint256 => uint256) miningPassTierToDepositLimit; // slot 18 + address[] miningPassFeeReceivers; // slot 19 + uint256[] miningPassFeeReceiversShares; // slot 20 /////////////// /// GENERAL /// /////////////// - address depositToken; // slot 25 - address rewardToken; // slot 26 - address feeToken; // slot 27 - address stratosphereAddress; // slot 28 - uint256 reentrancyGuardStatus; // slot 29 - address emissionsManager; // slot 30 - ///////////////////////////////////////// - /// MINING PASS (extended) - appended /// - ///////////////////////////////////////// - address[] miningPassFeeReceivers; // slot 31 - uint256[] miningPassFeeReceiversShares; // slot 32 + address depositToken; // slot 21 + address rewardToken; // slot 22 + address feeToken; // slot 23 + address stratosphereAddress; // slot 24 + uint256 reentrancyGuardStatus; // slot 25 + address emissionsManager; // slot 26 + ////////////////////////////////////////// + /// DYNAMIC PRICING (appended safely) /// + ////////////////////////////////////////// /// @dev Base fees (original fees set at deployment, used for floor price calculation) - mapping(uint256 => uint256) baseMiningPassTierToFee; // slot 33 + mapping(uint256 => uint256) baseMiningPassTierToFee; // slot 27 /// @dev Floor price percentage in basis points (e.g., 2500 = 25%) - uint256 miningPassFeeFloorBps; // slot 34 + uint256 miningPassFeeFloorBps; // slot 28 ////////////////// /// AUTOMATION /// ////////////////// - address gelatoExecutor; // slot 35 - mapping(uint256 => bool) isSeasonClaimed; // slot 36 + address gelatoExecutor; // slot 29 + mapping(uint256 => bool) isSeasonClaimed; // slot 30 } diff --git a/src/upgradeInitializers/FujiMigrationInit.sol b/src/upgradeInitializers/FujiMigrationInit.sol new file mode 100644 index 0000000..055b0a9 --- /dev/null +++ b/src/upgradeInitializers/FujiMigrationInit.sol @@ -0,0 +1,219 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.18; + +import {AppStorage} from "../libraries/AppStorage.sol"; + +/// @title FujiMigrationInit +/// @notice One-time migration initializer for the Fuji testnet diamond. +/// +/// Problem: Fuji was deployed at commit 14f06c0 which had a different AppStorage +/// layout (extra unlock discount mappings at slots 8-10 and restake fields at +/// slots 19-21) compared to production. This shifted the GENERAL section +/// (depositToken, rewardToken, feeToken, etc.) to slots 25-30 on Fuji, whereas +/// production has them at slots 21-26. +/// +/// This initializer: +/// 1. Reads the 6 GENERAL scalar values from old Fuji slots 25-30 +/// 2. Writes them to production-compatible slots 21-26 +/// 3. Clears the old slots 27-30 to avoid stale data +/// 4. Re-initializes all mapping/array-based config (fees, receivers, etc.) +/// since mapping data is keyed by keccak256(key, slot) and won't carry over +/// +/// After running this, the Fuji diamond's storage layout matches production, +/// and all facets compiled against the production AppStorage will work correctly. +contract FujiMigrationInit { + AppStorage s; + + struct Args { + // Fee receivers for unlock + address[] unlockFeeReceivers; + uint256[] unlockFeeReceiversShares; + // Fee receivers for boost + address[] boostFeeReceivers; + uint256[] boostFeeReceiversShares; + // Fee receivers for mining pass + address[] miningPassFeeReceivers; + uint256[] miningPassFeeReceiversShares; + } + + /// @notice Migrate Fuji storage from 14f06c0 layout to production layout. + /// @dev Must be called via diamondCut delegatecall exactly once. + function init(Args memory _args) external { + // ─── Step 1: Migrate GENERAL scalars from old Fuji slots to prod slots ─── + // + // Old Fuji layout (14f06c0): Production layout: + // slot 25 = depositToken slot 21 = depositToken + // slot 26 = rewardToken slot 22 = rewardToken + // slot 27 = feeToken slot 23 = feeToken + // slot 28 = stratosphereAddress slot 24 = stratosphereAddress + // slot 29 = reentrancyGuardStatus slot 25 = reentrancyGuardStatus + // slot 30 = emissionsManager slot 26 = emissionsManager + // + // We read from old slots and write to new slots using assembly. + // New slots 21-24 were previously mapping base slots (pendingWithdrawals, + // miningPassTierToFee, etc.) which are always 0, so overwriting is safe. + + address depositToken; + address rewardToken; + address feeToken; + address stratosphereAddress; + uint256 reentrancyGuardStatus; + address emissionsManager; + + assembly { + depositToken := sload(25) + rewardToken := sload(26) + feeToken := sload(27) + stratosphereAddress := sload(28) + reentrancyGuardStatus := sload(29) + emissionsManager := sload(30) + } + + // Verify we read valid data (sanity check) + require(depositToken != address(0), "FujiMigration: depositToken is zero"); + require(feeToken != address(0), "FujiMigration: feeToken is zero"); + + assembly { + // Write to production slots (21-26) + sstore(21, depositToken) + sstore(22, rewardToken) + sstore(23, feeToken) + sstore(24, stratosphereAddress) + sstore(25, reentrancyGuardStatus) + sstore(26, emissionsManager) + + // Clear old slots that are no longer used as scalars + // Slot 27 is now baseMiningPassTierToFee (mapping base = 0) + sstore(27, 0) + // Slot 28 is now miningPassFeeFloorBps (will be set below) + // Slot 29 is now gelatoExecutor (address, leave 0 for now) + sstore(29, 0) + // Slot 30 is now isSeasonClaimed (mapping base = 0) + sstore(30, 0) + } + + // ─── Step 2: Re-initialize mapping/array data ─── + // Mappings use keccak256(key, slot) for storage, so data written under + // old slot numbers is now inaccessible. We must re-set everything. + + // Unlock fee receivers (prod slots 9-10, old Fuji slots 12-13) + // Clear any stale length at slots 9-10 first + _clearArray(9); + _clearArray(10); + for (uint256 i = 0; i < _args.unlockFeeReceivers.length; i++) { + s.unlockFeeReceivers.push(_args.unlockFeeReceivers[i]); + s.unlockFeeReceiversShares.push(_args.unlockFeeReceiversShares[i]); + } + + // Boost fee receivers (prod slots 14-15, old Fuji slots 17-18) + _clearArray(14); + _clearArray(15); + for (uint256 i = 0; i < _args.boostFeeReceivers.length; i++) { + s.boostFeeReceivers.push(_args.boostFeeReceivers[i]); + s.boostFeeReceiversShares.push(_args.boostFeeReceiversShares[i]); + } + + // Mining pass fee receivers (prod slots 19-20, never existed in 14f06c0) + _clearArray(19); + _clearArray(20); + for (uint256 i = 0; i < _args.miningPassFeeReceivers.length; i++) { + s.miningPassFeeReceivers.push(_args.miningPassFeeReceivers[i]); + s.miningPassFeeReceiversShares.push(_args.miningPassFeeReceiversShares[i]); + } + + // Re-initialize mining pass fees (prod slot 17, old Fuji slot 23) + s.miningPassTierToFee[0] = 0; + s.miningPassTierToFee[1] = 0.5 * 1e6; + s.miningPassTierToFee[2] = 1 * 1e6; + s.miningPassTierToFee[3] = 2 * 1e6; + s.miningPassTierToFee[4] = 4 * 1e6; + s.miningPassTierToFee[5] = 8 * 1e6; + s.miningPassTierToFee[6] = 15 * 1e6; + s.miningPassTierToFee[7] = 30 * 1e6; + s.miningPassTierToFee[8] = 50 * 1e6; + s.miningPassTierToFee[9] = 75 * 1e6; + s.miningPassTierToFee[10] = 100 * 1e6; + + // Base mining pass fees (prod slot 27, new field) + s.baseMiningPassTierToFee[0] = 0; + s.baseMiningPassTierToFee[1] = 0.5 * 1e6; + s.baseMiningPassTierToFee[2] = 1 * 1e6; + s.baseMiningPassTierToFee[3] = 2 * 1e6; + s.baseMiningPassTierToFee[4] = 4 * 1e6; + s.baseMiningPassTierToFee[5] = 8 * 1e6; + s.baseMiningPassTierToFee[6] = 15 * 1e6; + s.baseMiningPassTierToFee[7] = 30 * 1e6; + s.baseMiningPassTierToFee[8] = 50 * 1e6; + s.baseMiningPassTierToFee[9] = 75 * 1e6; + s.baseMiningPassTierToFee[10] = 100 * 1e6; + + // Mining pass deposit limits (prod slot 18, old Fuji slot 24) + s.miningPassTierToDepositLimit[0] = 5_000 * 1e18; + s.miningPassTierToDepositLimit[1] = 10_000 * 1e18; + s.miningPassTierToDepositLimit[2] = 25_000 * 1e18; + s.miningPassTierToDepositLimit[3] = 60_000 * 1e18; + s.miningPassTierToDepositLimit[4] = 150_000 * 1e18; + s.miningPassTierToDepositLimit[5] = 350_000 * 1e18; + s.miningPassTierToDepositLimit[6] = 800_000 * 1e18; + s.miningPassTierToDepositLimit[7] = 1_800_000 * 1e18; + s.miningPassTierToDepositLimit[8] = 4_500_000 * 1e18; + s.miningPassTierToDepositLimit[9] = 12_000_000 * 1e18; + s.miningPassTierToDepositLimit[10] = type(uint256).max; + + // Mining pass fee floor (25% = 2500 bps) + s.miningPassFeeFloorBps = 2500; + + // Re-initialize unlock timestamp discounts (prod slot 7, same slot in Fuji) + // These mappings are at the SAME slot (7) in both layouts, so data is still + // accessible. But let's ensure they're set correctly: + s.unlockTimestampDiscountForStratosphereMembers[0] = 500; + s.unlockTimestampDiscountForStratosphereMembers[1] = 550; + s.unlockTimestampDiscountForStratosphereMembers[2] = 650; + s.unlockTimestampDiscountForStratosphereMembers[3] = 800; + s.unlockTimestampDiscountForStratosphereMembers[4] = 1000; + s.unlockTimestampDiscountForStratosphereMembers[5] = 1500; + + // Re-initialize boost fees (prod slot 12, old Fuji slot 15) + s.boostLevelToFee[0] = 0; + s.boostLevelToFee[1] = 2 * 1e6; + s.boostLevelToFee[2] = 3 * 1e6; + s.boostLevelToFee[3] = 4 * 1e6; + + // Re-initialize boost percent tiers (prod slot 13, old Fuji slot 16) + s.boostPercentFromTierToLevel[0][0] = 20; + s.boostPercentFromTierToLevel[1][0] = 25; + s.boostPercentFromTierToLevel[2][0] = 33; + s.boostPercentFromTierToLevel[3][0] = 45; + s.boostPercentFromTierToLevel[4][0] = 65; + s.boostPercentFromTierToLevel[5][0] = 100; + s.boostPercentFromTierToLevel[0][1] = 22; + s.boostPercentFromTierToLevel[1][1] = 28; + s.boostPercentFromTierToLevel[2][1] = 37; + s.boostPercentFromTierToLevel[3][1] = 51; + s.boostPercentFromTierToLevel[4][1] = 74; + s.boostPercentFromTierToLevel[5][1] = 115; + s.boostPercentFromTierToLevel[0][2] = 24; + s.boostPercentFromTierToLevel[1][2] = 30; + s.boostPercentFromTierToLevel[2][2] = 40; + s.boostPercentFromTierToLevel[3][2] = 55; + s.boostPercentFromTierToLevel[4][2] = 81; + s.boostPercentFromTierToLevel[5][2] = 125; + s.boostPercentFromTierToLevel[0][3] = 28; + s.boostPercentFromTierToLevel[1][3] = 35; + s.boostPercentFromTierToLevel[2][3] = 47; + s.boostPercentFromTierToLevel[3][3] = 64; + s.boostPercentFromTierToLevel[4][3] = 94; + s.boostPercentFromTierToLevel[5][3] = 145; + + // boostForNonStratMembers (prod slot 11, old Fuji slot 14 — different slot, re-set) + s.boostForNonStratMembers = 10; + } + + /// @dev Clear a dynamic array's length so .push() starts fresh. + /// Array data at keccak256(slot) is orphaned but harmless. + function _clearArray(uint256 slot) internal { + assembly { + sstore(slot, 0) + } + } +} diff --git a/test/foundry/fork/FujiForkMiningPass.t.sol b/test/foundry/fork/FujiForkMiningPass.t.sol index 44ab2d8..1335fa0 100644 --- a/test/foundry/fork/FujiForkMiningPass.t.sol +++ b/test/foundry/fork/FujiForkMiningPass.t.sol @@ -7,14 +7,27 @@ import {IDiamondCut} from "clouds/interfaces/IDiamondCut.sol"; import {IDiamondLoupe} from "clouds/interfaces/IDiamondLoupe.sol"; import {DiamondManagerFacet} from "src/facets/DiamondManagerFacet.sol"; import {MiningPassFacet} from "src/facets/MiningPassFacet.sol"; +import {BoostFacet} from "src/facets/BoostFacet.sol"; +import {DepositFacet} from "src/facets/DepositFacet.sol"; +import {ClaimFacet} from "src/facets/ClaimFacet.sol"; +import {UnlockFacet} from "src/facets/UnlockFacet.sol"; +import {WithdrawFacet} from "src/facets/WithdrawFacet.sol"; +import {FeeCollectorFacet} from "src/facets/FeeCollectorFacet.sol"; +import {AuthorizationFacet} from "src/facets/AuthorizationFacet.sol"; +import {PausationFacet} from "src/facets/PausationFacet.sol"; +import {FujiMigrationInit} from "src/upgradeInitializers/FujiMigrationInit.sol"; /// @title FujiForkMiningPassTest -/// @notice Fork test against the real Fuji diamond to verify storage layout fix. -/// The diamond was deployed at commit 14f06c0 which placed GENERAL fields -/// (depositToken, rewardToken, feeToken, ...) at slots 25-30. A prior -/// upgrade shifted those fields causing feeToken (slot 25 in broken HEAD) -/// to read depositToken data (VPND). The fixed AppStorage restores the -/// original slot layout with deprecated gap fields. +/// @notice Fork test against the real Fuji diamond to verify the storage +/// migration from the 14f06c0 layout to the production layout. +/// +/// Fuji was deployed at commit 14f06c0 which placed GENERAL fields +/// (depositToken, rewardToken, feeToken) at slots 25-27. Production +/// has them at slots 21-23. +/// +/// The migration initializer reads scalars from old slots 25-30, +/// writes them to production slots 21-26, then re-initializes all +/// mapping/array config data that moved between slot numbers. contract FujiForkMiningPassTest is Test { // ──── Real Fuji addresses ──── address constant DIAMOND = 0xEd98549D4dE52811b3b417A717E3d74AC90F9Ffe; @@ -37,63 +50,83 @@ contract FujiForkMiningPassTest is Test { loupe = IDiamondLoupe(DIAMOND); user = makeAddr("testUser"); - // Read the owner from the OwnershipFacet (bool ok, bytes memory data) = DIAMOND.staticcall(abi.encodeWithSignature("owner()")); require(ok, "owner() call failed"); owner = abi.decode(data, (address)); } // ═══════════════════════════════════════════════════════════════════ - // STORAGE LAYOUT VERIFICATION + // PRE-MIGRATION STORAGE CHECK // ═══════════════════════════════════════════════════════════════════ - /// @notice Verify raw storage slots 25-28 hold the original 14f06c0 token addresses - function test_Fork_VerifyStorageLayout() public { - address slot25 = address(uint160(uint256(vm.load(DIAMOND, bytes32(uint256(25)))))); - address slot26 = address(uint160(uint256(vm.load(DIAMOND, bytes32(uint256(26)))))); - address slot27 = address(uint160(uint256(vm.load(DIAMOND, bytes32(uint256(27)))))); - address slot28 = address(uint160(uint256(vm.load(DIAMOND, bytes32(uint256(28)))))); - - console.log("Raw storage:"); - console.log(" slot 25 (depositToken):", slot25); - console.log(" slot 26 (rewardToken):", slot26); - console.log(" slot 27 (feeToken):", slot27); - console.log(" slot 28 (stratosphere):", slot28); - - assertEq(slot25, VPND, "slot 25 should be VPND (depositToken)"); - assertEq(slot26, VAPE, "slot 26 should be VAPE (rewardToken)"); - assertEq(slot27, USDC, "slot 27 should be USDC (feeToken)"); - assertEq(slot28, STRATOSPHERE, "slot 28 should be stratosphere"); + /// @notice Confirm that on-chain Fuji storage has GENERAL fields at + /// the OLD 14f06c0 slots (25-28), not production slots (21-24). + function test_Fork_PreMigration_OldSlotLayout() public { + // Old Fuji 14f06c0 layout: GENERAL at slots 25-28 + address slot25 = _readAddress(25); + address slot26 = _readAddress(26); + address slot27 = _readAddress(27); + address slot28 = _readAddress(28); + + console.log("Pre-migration (old Fuji slots 25-28):"); + console.log(" slot 25:", slot25); + console.log(" slot 26:", slot26); + console.log(" slot 27:", slot27); + console.log(" slot 28:", slot28); + + assertEq(slot25, VPND, "old slot 25 should be VPND (depositToken)"); + assertEq(slot26, VAPE, "old slot 26 should be VAPE (rewardToken)"); + assertEq(slot27, USDC, "old slot 27 should be USDC (feeToken)"); + assertEq(slot28, STRATOSPHERE, "old slot 28 should be stratosphere"); + + // Production slots 21-24 should NOT have these values yet + address slot21 = _readAddress(21); + address slot23 = _readAddress(23); + assertTrue(slot21 != VPND, "prod slot 21 should NOT have VPND yet"); + assertTrue(slot23 != USDC, "prod slot 23 should NOT have USDC yet"); } - /// @notice After upgrading facets on the fork, feeToken should be USDC - function test_Fork_AfterUpgrade_FeeTokenIsUSDC() public { - _upgradeFacets(); - _reinitializeMiningPassData(); + // ═══════════════════════════════════════════════════════════════════ + // POST-MIGRATION STORAGE CHECK + // ═══════════════════════════════════════════════════════════════════ + + /// @notice After the full migration, GENERAL fields should be at + /// production slots (21-26) and facet reads should work. + function test_Fork_AfterMigration_FeeTokenIsUSDC() public { + _upgradeAndMigrate(); + + // Verify raw storage at production slots + assertEq(_readAddress(21), VPND, "prod slot 21 = depositToken = VPND"); + assertEq(_readAddress(22), VAPE, "prod slot 22 = rewardToken = VAPE"); + assertEq(_readAddress(23), USDC, "prod slot 23 = feeToken = USDC"); + assertEq(_readAddress(24), STRATOSPHERE, "prod slot 24 = stratosphere"); - // feeToken at slot 27 = USDC (from original 14f06c0 init) - assertEq(diamond.getStratosphereAddress(), STRATOSPHERE, "stratosphere should be correct"); + // Old Fuji slot 27 should be cleared (was USDC/feeToken before migration) + assertEq(_readAddress(27), address(0), "old slot 27 should be cleared"); + // Slot 28 is now miningPassFeeFloorBps (= 2500), NOT an old address slot + assertEq(uint256(vm.load(DIAMOND, bytes32(uint256(28)))), 2500, "slot 28 = miningPassFeeFloorBps = 2500"); + // Verify via facet getters + assertEq(diamond.getStratosphereAddress(), STRATOSPHERE, "stratosphere getter works"); + + // Verify mining pass fees were re-initialized uint256 tier1Fee = diamond.getMiningPassTierFee(1); console.log("Tier 1 fee:", tier1Fee); - assertTrue(tier1Fee > 0, "tier 1 fee should be non-zero after reinit"); + assertEq(tier1Fee, 0.5 * 1e6, "tier 1 fee should be 0.5 USDC"); uint256 floorBps = diamond.getMiningPassFeeFloorBps(); assertEq(floorBps, 2500, "floor should be 2500 bps"); } - /// @notice Full end-to-end: upgrade, reinit, purchase mining pass — USDC spent, not VPND - function test_Fork_AfterUpgrade_PurchaseUsesUSDC() public { - _upgradeFacets(); - _reinitializeMiningPassData(); - _setupMiningPassFeeReceivers(); + /// @notice Full e2e: migrate -> purchase mining pass -> only USDC is spent + function test_Fork_AfterMigration_PurchaseUsesUSDC() public { + _upgradeAndMigrate(); _ensureActiveSeason(); uint256 fee = diamond.getMiningPassTierFee(1); require(fee > 0, "fee is 0"); console.log("Tier 1 fee:", fee); - // Give user USDC and VPND deal(USDC, user, fee * 10); deal(VPND, user, fee * 10); @@ -120,65 +153,68 @@ contract FujiForkMiningPassTest is Test { // HELPERS // ═══════════════════════════════════════════════════════════════════ - /// @dev Deploy new facets (compiled with fixed AppStorage) and replace them - /// in the diamond. Uses the loupe to dynamically get all registered - /// selectors for each facet so we don't miss any. - function _upgradeFacets() internal { - DiamondManagerFacet newDMF = new DiamondManagerFacet(); - MiningPassFacet newMPF = new MiningPassFacet(); + function _readAddress(uint256 slot) internal view returns (address) { + return address(uint160(uint256(vm.load(DIAMOND, bytes32(slot))))); + } - // Use the loupe to find existing facet addresses via known selectors - address oldDmfAddr = loupe.facetAddress(DiamondManagerFacet.setDepositToken.selector); - address oldMpfAddr = loupe.facetAddress(MiningPassFacet.purchase.selector); + /// @dev Upgrade ALL facets + run the FujiMigrationInit initializer in a + /// single diamondCut call — exactly how the real upgrade will work. + function _upgradeAndMigrate() internal { + // Deploy the migration initializer + FujiMigrationInit migrationInit = new FujiMigrationInit(); - // Get ALL registered selectors for those facets - bytes4[] memory dmfSelectors = loupe.facetFunctionSelectors(oldDmfAddr); - bytes4[] memory mpfSelectors = loupe.facetFunctionSelectors(oldMpfAddr); + // Build cuts array: deploy new facets, look up old facet via loupe, replace + IDiamondCut.FacetCut[] memory cuts = _buildAllFacetCuts(); - console.log("DMF selectors to replace:", dmfSelectors.length); - console.log("MPF selectors to replace:", mpfSelectors.length); - - IDiamondCut.FacetCut[] memory cuts = new IDiamondCut.FacetCut[](2); - cuts[0] = IDiamondCut.FacetCut({ - facetAddress: address(newDMF), action: IDiamondCut.FacetCutAction.Replace, functionSelectors: dmfSelectors - }); - cuts[1] = IDiamondCut.FacetCut({ - facetAddress: address(newMPF), action: IDiamondCut.FacetCutAction.Replace, functionSelectors: mpfSelectors - }); + // Encode the migration initializer call + FujiMigrationInit.Args memory migArgs = _buildMigrationArgs(); vm.prank(owner); - IDiamondCut(DIAMOND).diamondCut(cuts, address(0), ""); + IDiamondCut(DIAMOND) + .diamondCut(cuts, address(migrationInit), abi.encodeWithSelector(FujiMigrationInit.init.selector, migArgs)); } - function _reinitializeMiningPassData() internal { - uint256[] memory fees = new uint256[](11); - fees[0] = 0; - fees[1] = 0.5 * 1e6; // tier 1: 0.5 USDC - fees[2] = 1 * 1e6; - fees[3] = 2 * 1e6; - fees[4] = 4 * 1e6; - fees[5] = 8 * 1e6; - fees[6] = 15 * 1e6; - fees[7] = 30 * 1e6; - fees[8] = 50 * 1e6; - fees[9] = 75 * 1e6; - fees[10] = 100 * 1e6; - - vm.startPrank(owner); - diamond.setBaseMiningPassFees(fees); - diamond.setMiningPassFees(fees); - diamond.setMiningPassFeeFloor(2500); - vm.stopPrank(); + function _buildAllFacetCuts() internal returns (IDiamondCut.FacetCut[] memory cuts) { + cuts = new IDiamondCut.FacetCut[](10); + cuts[0] = _deployAndReplace(address(new DiamondManagerFacet()), DiamondManagerFacet.setDepositToken.selector); + cuts[1] = _deployAndReplace(address(new MiningPassFacet()), MiningPassFacet.purchase.selector); + cuts[2] = _deployAndReplace(address(new BoostFacet()), BoostFacet.claimBoost.selector); + cuts[3] = _deployAndReplace(address(new DepositFacet()), DepositFacet.deposit.selector); + cuts[4] = _deployAndReplace(address(new ClaimFacet()), ClaimFacet.automatedClaim.selector); + cuts[5] = _deployAndReplace(address(new UnlockFacet()), UnlockFacet.unlock.selector); + cuts[6] = _deployAndReplace(address(new WithdrawFacet()), WithdrawFacet.withdrawUnlocked.selector); + cuts[7] = _deployAndReplace(address(new FeeCollectorFacet()), FeeCollectorFacet.collectBoostFees.selector); + cuts[8] = _deployAndReplace(address(new AuthorizationFacet()), AuthorizationFacet.authorize.selector); + cuts[9] = _deployAndReplace(address(new PausationFacet()), PausationFacet.pause.selector); } - function _setupMiningPassFeeReceivers() internal { - address[] memory receivers = new address[](1); - receivers[0] = makeAddr("feeReceiver"); - uint256[] memory shares = new uint256[](1); - shares[0] = 10000; // 100% + function _deployAndReplace(address newFacet, bytes4 knownSelector) + internal + view + returns (IDiamondCut.FacetCut memory) + { + address oldFacet = loupe.facetAddress(knownSelector); + bytes4[] memory selectors = loupe.facetFunctionSelectors(oldFacet); + return IDiamondCut.FacetCut({ + facetAddress: newFacet, action: IDiamondCut.FacetCutAction.Replace, functionSelectors: selectors + }); + } - vm.prank(owner); - diamond.setMiningPassFeeReceivers(receivers, shares); + function _buildMigrationArgs() internal returns (FujiMigrationInit.Args memory migArgs) { + migArgs.unlockFeeReceivers = new address[](1); + migArgs.unlockFeeReceivers[0] = makeAddr("unlockFeeReceiver"); + migArgs.unlockFeeReceiversShares = new uint256[](1); + migArgs.unlockFeeReceiversShares[0] = 10000; + + migArgs.boostFeeReceivers = new address[](1); + migArgs.boostFeeReceivers[0] = makeAddr("boostFeeReceiver"); + migArgs.boostFeeReceiversShares = new uint256[](1); + migArgs.boostFeeReceiversShares[0] = 10000; + + migArgs.miningPassFeeReceivers = new address[](1); + migArgs.miningPassFeeReceivers[0] = makeAddr("miningPassFeeReceiver"); + migArgs.miningPassFeeReceiversShares = new uint256[](1); + migArgs.miningPassFeeReceiversShares[0] = 10000; } function _ensureActiveSeason() internal { @@ -189,10 +225,12 @@ contract FujiForkMiningPassTest is Test { return; } - // Read season end timestamp from storage (Season struct in mapping at slot 4) - bytes32 baseSlot = keccak256(abi.encode(seasonId, uint256(4))); - uint256 endTs = uint256(vm.load(DIAMOND, bytes32(uint256(baseSlot) + 2))); - if (endTs <= block.timestamp) { + try diamond.getSeasonEndTimestamp(seasonId) returns (uint256 endTs) { + if (endTs <= block.timestamp) { + vm.prank(owner); + diamond.startNewSeasonWithEndTimestamp(1000 * 1e18, block.timestamp + 30 days); + } + } catch { vm.prank(owner); diamond.startNewSeasonWithEndTimestamp(1000 * 1e18, block.timestamp + 30 days); } From e3c5ff48adea6e18fcf0403fd343011c807fedc1 Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Wed, 25 Feb 2026 20:10:24 +0530 Subject: [PATCH 4/7] feat: update contract deployments and add migration script for Fuji - Updated UnlockFacet and WithdrawFacet deployments with new bytecode and addresses. - Added migration script for Fuji to handle contract upgrades and data migration. - Introduced task to update mining pass fees based on current VAPE price. --- deployments/AuthorizationFacet.json | 6 +- deployments/BoostFacet.json | 6 +- deployments/ClaimFacet.json | 6 +- deployments/DepositFacet.json | 6 +- deployments/DiamondManagerFacet.json | 6 +- deployments/FeeCollectorFacet.json | 6 +- deployments/FujiMigrationInit.json | 66 +++++++++++++++ deployments/MiningPassFacet.json | 6 +- deployments/PausationFacet.json | 6 +- deployments/UnlockFacet.json | 6 +- deployments/WithdrawFacet.json | 6 +- hardhat.config.ts | 1 + scripts/migrateFuji.ts | 120 +++++++++++++++++++++++++++ tasks/updateMiningPassFees.ts | 104 +++++++++++++++++++++++ 14 files changed, 321 insertions(+), 30 deletions(-) create mode 100644 deployments/FujiMigrationInit.json create mode 100644 scripts/migrateFuji.ts create mode 100644 tasks/updateMiningPassFees.ts diff --git a/deployments/AuthorizationFacet.json b/deployments/AuthorizationFacet.json index af0394f..8c01079 100644 --- a/deployments/AuthorizationFacet.json +++ b/deployments/AuthorizationFacet.json @@ -56,8 +56,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061024b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80633bbbc7c914610046578063b6a5d7de1461005b578063b91816111461006e575b600080fd5b6100596100543660046101d8565b6100bb565b005b6100596100693660046101d8565b61010f565b6100a761007c3660046101d8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b604051901515815260200160405180910390f35b6100c3610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610117610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101d6576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000602082840312156101ea57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020e57600080fd5b939250505056fea2646970667358221220e69d9fcd8693fd2077284a7845242557f17631c80d796b01e59d083d5fe481b664736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633bbbc7c914610046578063b6a5d7de1461005b578063b91816111461006e575b600080fd5b6100596100543660046101d8565b6100bb565b005b6100596100693660046101d8565b61010f565b6100a761007c3660046101d8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b604051901515815260200160405180910390f35b6100c3610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610117610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101d6576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000602082840312156101ea57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020e57600080fd5b939250505056fea2646970667358221220e69d9fcd8693fd2077284a7845242557f17631c80d796b01e59d083d5fe481b664736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b5061024b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80633bbbc7c914610046578063b6a5d7de1461005b578063b91816111461006e575b600080fd5b6100596100543660046101d8565b6100bb565b005b6100596100693660046101d8565b61010f565b6100a761007c3660046101d8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b604051901515815260200160405180910390f35b6100c3610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610117610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101d6576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000602082840312156101ea57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020e57600080fd5b939250505056fea2646970667358221220bce5ec74cdbefd9a39897784ad951f81bd7e0381c4108ba2a56fd47d45ec217364736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633bbbc7c914610046578063b6a5d7de1461005b578063b91816111461006e575b600080fd5b6100596100543660046101d8565b6100bb565b005b6100596100693660046101d8565b61010f565b6100a761007c3660046101d8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b604051901515815260200160405180910390f35b6100c3610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610117610166565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101d6576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6000602082840312156101ea57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020e57600080fd5b939250505056fea2646970667358221220bce5ec74cdbefd9a39897784ad951f81bd7e0381c4108ba2a56fd47d45ec217364736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -66,7 +66,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0xfd27E4e7730B8B636377974db80E9635b9583D3a" + "address": "0x41B02390B78289d474ece028CFB9E1156a35f40B" }, "hardhat": { "artifact": { diff --git a/deployments/BoostFacet.json b/deployments/BoostFacet.json index 8fee60c..3002470 100644 --- a/deployments/BoostFacet.json +++ b/deployments/BoostFacet.json @@ -82,8 +82,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506106fc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063502d296714610030575b600080fd5b61004361003e36600461059c565b610045565b005b60025460008181526005602090815260408083203384529091528120805490910361009c576040517f3a0d884600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004810154158015906100c05750620151808160040154426100be91906105e4565b105b156100f7576040517f269eb72b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610105600033610266565b60ff16915091506000610118838761031e565b4260048601559050600061012d848489610386565b9050600061013c8683896103ba565b90508086600301600082825461015291906105f7565b90915550506005860181905582156102105761016d83610488565b6019546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af11580156101ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020e919061060a565b505b604080518981526020810183905290810184905260608101859052339088907fd3a080433deb263ff167dc354e7f90486543d360ea1e03ff1264490f3429ffef9060800160405180910390a35050505050505050565b601a8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa1580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610304919061062c565b905080156103155760019350600092505b50509250929050565b6000821561033b57506000818152600c6020526040902054610380565b821580156103495750600082115b15610380576040517f3055f2cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b600083156103ae57506000828152600d602090815260408083208484529091529020546103b3565b50600b545b9392505050565b6000826000036103cc575060006103b3565b6000828152600460205260408120600281015490919062015180906103f29042906105e4565b6103fc9190610645565b905080600003610411576000925050506103b3565b8554600090610421908390610680565b8760030154886002015461043591906105f7565b61043f91906105e4565b90508060000361045557600093505050506103b3565b60006104618288610583565b90508084600701600082825461047791906105f7565b909155509098975050505050505050565b600e8054600f805490919081146104cb576040517f44e29d8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561057c5760006104fe868584815481106104ee576104ee610697565b9060005260206000200154610583565b9050806000601001600087858154811061051a5761051a610697565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182206019549094168252929092528120805490919061056e9084906105f7565b9091555050506001016104ce565b5050505050565b60006127106105928385610680565b6103b39190610645565b6000602082840312156105ae57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610380576103806105b5565b80820180821115610380576103806105b5565b60006020828403121561061c57600080fd5b815180151581146103b357600080fd5b60006020828403121561063e57600080fd5b5051919050565b60008261067b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610380576103806105b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220316babebf3d79b80a3c96e3cac17864ac7ec9a492f0315c3d77f5b194a0e443064736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063502d296714610030575b600080fd5b61004361003e36600461059c565b610045565b005b60025460008181526005602090815260408083203384529091528120805490910361009c576040517f3a0d884600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004810154158015906100c05750620151808160040154426100be91906105e4565b105b156100f7576040517f269eb72b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610105600033610266565b60ff16915091506000610118838761031e565b4260048601559050600061012d848489610386565b9050600061013c8683896103ba565b90508086600301600082825461015291906105f7565b90915550506005860181905582156102105761016d83610488565b6019546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af11580156101ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020e919061060a565b505b604080518981526020810183905290810184905260608101859052339088907fd3a080433deb263ff167dc354e7f90486543d360ea1e03ff1264490f3429ffef9060800160405180910390a35050505050505050565b601a8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa1580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610304919061062c565b905080156103155760019350600092505b50509250929050565b6000821561033b57506000818152600c6020526040902054610380565b821580156103495750600082115b15610380576040517f3055f2cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b600083156103ae57506000828152600d602090815260408083208484529091529020546103b3565b50600b545b9392505050565b6000826000036103cc575060006103b3565b6000828152600460205260408120600281015490919062015180906103f29042906105e4565b6103fc9190610645565b905080600003610411576000925050506103b3565b8554600090610421908390610680565b8760030154886002015461043591906105f7565b61043f91906105e4565b90508060000361045557600093505050506103b3565b60006104618288610583565b90508084600701600082825461047791906105f7565b909155509098975050505050505050565b600e8054600f805490919081146104cb576040517f44e29d8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561057c5760006104fe868584815481106104ee576104ee610697565b9060005260206000200154610583565b9050806000601001600087858154811061051a5761051a610697565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182206019549094168252929092528120805490919061056e9084906105f7565b9091555050506001016104ce565b5050505050565b60006127106105928385610680565b6103b39190610645565b6000602082840312156105ae57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610380576103806105b5565b80820180821115610380576103806105b5565b60006020828403121561061c57600080fd5b815180151581146103b357600080fd5b60006020828403121561063e57600080fd5b5051919050565b60008261067b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610380576103806105b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220316babebf3d79b80a3c96e3cac17864ac7ec9a492f0315c3d77f5b194a0e443064736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b506106fc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063502d296714610030575b600080fd5b61004361003e36600461059c565b610045565b005b60025460008181526005602090815260408083203384529091528120805490910361009c576040517f3a0d884600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004810154158015906100c05750620151808160040154426100be91906105e4565b105b156100f7576040517f269eb72b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610105600033610266565b60ff16915091506000610118838761031e565b4260048601559050600061012d848489610386565b9050600061013c8683896103ba565b90508086600301600082825461015291906105f7565b90915550506005860181905582156102105761016d83610488565b6017546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af11580156101ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020e919061060a565b505b604080518981526020810183905290810184905260608101859052339088907fd3a080433deb263ff167dc354e7f90486543d360ea1e03ff1264490f3429ffef9060800160405180910390a35050505050505050565b60188201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa1580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610304919061062c565b905080156103155760019350600092505b50509250929050565b6000821561033b57506000818152600c6020526040902054610380565b821580156103495750600082115b15610380576040517f3055f2cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b600083156103ae57506000828152600d602090815260408083208484529091529020546103b3565b50600b545b9392505050565b6000826000036103cc575060006103b3565b6000828152600460205260408120600281015490919062015180906103f29042906105e4565b6103fc9190610645565b905080600003610411576000925050506103b3565b8554600090610421908390610680565b8760030154886002015461043591906105f7565b61043f91906105e4565b90508060000361045557600093505050506103b3565b60006104618288610583565b90508084600701600082825461047791906105f7565b909155509098975050505050505050565b600e8054600f805490919081146104cb576040517f44e29d8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561057c5760006104fe868584815481106104ee576104ee610697565b9060005260206000200154610583565b9050806000601001600087858154811061051a5761051a610697565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182206017549094168252929092528120805490919061056e9084906105f7565b9091555050506001016104ce565b5050505050565b60006127106105928385610680565b6103b39190610645565b6000602082840312156105ae57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610380576103806105b5565b80820180821115610380576103806105b5565b60006020828403121561061c57600080fd5b815180151581146103b357600080fd5b60006020828403121561063e57600080fd5b5051919050565b60008261067b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610380576103806105b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122076ed51990e9b210eedc0eaebe888c7c2b5dad791a2b1c05cd4a6f8f2a9e492c564736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063502d296714610030575b600080fd5b61004361003e36600461059c565b610045565b005b60025460008181526005602090815260408083203384529091528120805490910361009c576040517f3a0d884600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004810154158015906100c05750620151808160040154426100be91906105e4565b105b156100f7576040517f269eb72b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610105600033610266565b60ff16915091506000610118838761031e565b4260048601559050600061012d848489610386565b9050600061013c8683896103ba565b90508086600301600082825461015291906105f7565b90915550506005860181905582156102105761016d83610488565b6017546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af11580156101ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020e919061060a565b505b604080518981526020810183905290810184905260608101859052339088907fd3a080433deb263ff167dc354e7f90486543d360ea1e03ff1264490f3429ffef9060800160405180910390a35050505050505050565b60188201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa1580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610304919061062c565b905080156103155760019350600092505b50509250929050565b6000821561033b57506000818152600c6020526040902054610380565b821580156103495750600082115b15610380576040517f3055f2cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b600083156103ae57506000828152600d602090815260408083208484529091529020546103b3565b50600b545b9392505050565b6000826000036103cc575060006103b3565b6000828152600460205260408120600281015490919062015180906103f29042906105e4565b6103fc9190610645565b905080600003610411576000925050506103b3565b8554600090610421908390610680565b8760030154886002015461043591906105f7565b61043f91906105e4565b90508060000361045557600093505050506103b3565b60006104618288610583565b90508084600701600082825461047791906105f7565b909155509098975050505050505050565b600e8054600f805490919081146104cb576040517f44e29d8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561057c5760006104fe868584815481106104ee576104ee610697565b9060005260206000200154610583565b9050806000601001600087858154811061051a5761051a610697565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116845283820194909452604092830182206017549094168252929092528120805490919061056e9084906105f7565b9091555050506001016104ce565b5050505050565b60006127106105928385610680565b6103b39190610645565b6000602082840312156105ae57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610380576103806105b5565b80820180821115610380576103806105b5565b60006020828403121561061c57600080fd5b815180151581146103b357600080fd5b60006020828403121561063e57600080fd5b5051919050565b60008261067b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417610380576103806105b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122076ed51990e9b210eedc0eaebe888c7c2b5dad791a2b1c05cd4a6f8f2a9e492c564736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -92,7 +92,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0x536BECeD986BD133Be29b1914A754388ac62B375" + "address": "0x89fc2e298AAAdb3a7DeaA0F90B9D1A773dc5904C" }, "hardhat": { "artifact": { diff --git a/deployments/ClaimFacet.json b/deployments/ClaimFacet.json index 0119aa8..618af2f 100644 --- a/deployments/ClaimFacet.json +++ b/deployments/ClaimFacet.json @@ -93,8 +93,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610a71806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806316890b2a1461003b57806359dff49414610050575b600080fd5b61004e6100493660046107f9565b610063565b005b61004e61005e366004610854565b6103c4565b61006e600033610710565b6000828152600460205260409020600281015442116100b9576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120600281015460068201549192909190829003610130576040517f4f231d2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088301541561016c576040517f3f943e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600301548361017e9190610972565b9050600061018c8287610773565b9050600061019a82886107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048901805492935083929091906101f7908490610985565b92505081905550808760060160008282546102129190610972565b90915550506018546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b49190610998565b5085546000906102c5908690610972565b6017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015610340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103649190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8b16918c917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350505050505050505050565b6103cf600033610710565b60008281526004602052604090206002810154421161041a576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160005b8181101561070957600084828151811061043b5761043b6109ba565b602090810291909101810151600088815260058352604080822073ffffffffffffffffffffffffffffffffffffffff84168352909352918220600281015460068201549294509092909190829003610496575050505061041f565b6008830154156104a9575050505061041f565b60008360030154836104bb9190610972565b905060006104c9828a610773565b905060006104d7828b6107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048c0180549293508392909190610534908490610985565b92505081905550808a600601600082825461054f9190610972565b90915550506018546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156105cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f19190610998565b508554600090610602908690610972565b6017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af115801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8a16918f917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350506001909601955061041f945050505050565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff1661076f576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6007810154600090818161078f86670de0b6b3a76400006109e9565b6107999190610a00565b925050505b92915050565b6000670de0b6b3a76400008383600301546107bf91906109e9565b6107c99190610a00565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f457600080fd5b919050565b6000806040838503121561080c57600080fd5b8235915061081c602084016107d0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561086757600080fd5b8235915060208084013567ffffffffffffffff8082111561088757600080fd5b818601915086601f83011261089b57600080fd5b8135818111156108ad576108ad610825565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156108f0576108f0610825565b60405291825284820192508381018501918983111561090e57600080fd5b938501935b8285101561093357610924856107d0565b84529385019392850192610913565b8096505050505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079e5761079e610943565b8181038181111561079e5761079e610943565b6000602082840312156109aa57600080fd5b815180151581146107c957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808202811582820484141761079e5761079e610943565b600082610a36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220da59b4c12674f0b8d1bd46712009a318fb17ec59602f240f461eb3c41e6ebc9564736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806316890b2a1461003b57806359dff49414610050575b600080fd5b61004e6100493660046107f9565b610063565b005b61004e61005e366004610854565b6103c4565b61006e600033610710565b6000828152600460205260409020600281015442116100b9576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120600281015460068201549192909190829003610130576040517f4f231d2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088301541561016c576040517f3f943e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600301548361017e9190610972565b9050600061018c8287610773565b9050600061019a82886107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048901805492935083929091906101f7908490610985565b92505081905550808760060160008282546102129190610972565b90915550506018546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b49190610998565b5085546000906102c5908690610972565b6017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015610340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103649190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8b16918c917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350505050505050505050565b6103cf600033610710565b60008281526004602052604090206002810154421161041a576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160005b8181101561070957600084828151811061043b5761043b6109ba565b602090810291909101810151600088815260058352604080822073ffffffffffffffffffffffffffffffffffffffff84168352909352918220600281015460068201549294509092909190829003610496575050505061041f565b6008830154156104a9575050505061041f565b60008360030154836104bb9190610972565b905060006104c9828a610773565b905060006104d7828b6107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048c0180549293508392909190610534908490610985565b92505081905550808a600601600082825461054f9190610972565b90915550506018546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156105cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f19190610998565b508554600090610602908690610972565b6017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af115801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8a16918f917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350506001909601955061041f945050505050565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff1661076f576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6007810154600090818161078f86670de0b6b3a76400006109e9565b6107999190610a00565b925050505b92915050565b6000670de0b6b3a76400008383600301546107bf91906109e9565b6107c99190610a00565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f457600080fd5b919050565b6000806040838503121561080c57600080fd5b8235915061081c602084016107d0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561086757600080fd5b8235915060208084013567ffffffffffffffff8082111561088757600080fd5b818601915086601f83011261089b57600080fd5b8135818111156108ad576108ad610825565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156108f0576108f0610825565b60405291825284820192508381018501918983111561090e57600080fd5b938501935b8285101561093357610924856107d0565b84529385019392850192610913565b8096505050505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079e5761079e610943565b8181038181111561079e5761079e610943565b6000602082840312156109aa57600080fd5b815180151581146107c957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808202811582820484141761079e5761079e610943565b600082610a36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220da59b4c12674f0b8d1bd46712009a318fb17ec59602f240f461eb3c41e6ebc9564736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b50610a71806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806316890b2a1461003b57806359dff49414610050575b600080fd5b61004e6100493660046107f9565b610063565b005b61004e61005e366004610854565b6103c4565b61006e600033610710565b6000828152600460205260409020600281015442116100b9576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120600281015460068201549192909190829003610130576040517f4f231d2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088301541561016c576040517f3f943e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600301548361017e9190610972565b9050600061018c8287610773565b9050600061019a82886107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048901805492935083929091906101f7908490610985565b92505081905550808760060160008282546102129190610972565b90915550506016546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b49190610998565b5085546000906102c5908690610972565b6015546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015610340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103649190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8b16918c917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350505050505050505050565b6103cf600033610710565b60008281526004602052604090206002810154421161041a576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160005b8181101561070957600084828151811061043b5761043b6109ba565b602090810291909101810151600088815260058352604080822073ffffffffffffffffffffffffffffffffffffffff84168352909352918220600281015460068201549294509092909190829003610496575050505061041f565b6008830154156104a9575050505061041f565b60008360030154836104bb9190610972565b905060006104c9828a610773565b905060006104d7828b6107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048c0180549293508392909190610534908490610985565b92505081905550808a600601600082825461054f9190610972565b90915550506016546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156105cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f19190610998565b508554600090610602908690610972565b6015546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af115801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8a16918f917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350506001909601955061041f945050505050565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff1661076f576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6007810154600090818161078f86670de0b6b3a76400006109e9565b6107999190610a00565b925050505b92915050565b6000670de0b6b3a76400008383600301546107bf91906109e9565b6107c99190610a00565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f457600080fd5b919050565b6000806040838503121561080c57600080fd5b8235915061081c602084016107d0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561086757600080fd5b8235915060208084013567ffffffffffffffff8082111561088757600080fd5b818601915086601f83011261089b57600080fd5b8135818111156108ad576108ad610825565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156108f0576108f0610825565b60405291825284820192508381018501918983111561090e57600080fd5b938501935b8285101561093357610924856107d0565b84529385019392850192610913565b8096505050505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079e5761079e610943565b8181038181111561079e5761079e610943565b6000602082840312156109aa57600080fd5b815180151581146107c957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808202811582820484141761079e5761079e610943565b600082610a36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea264697066735822122066f4cad131397d768cf6346cbde7862375e1dd99db0af404046466acb749cb4164736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806316890b2a1461003b57806359dff49414610050575b600080fd5b61004e6100493660046107f9565b610063565b005b61004e61005e366004610854565b6103c4565b61006e600033610710565b6000828152600460205260409020600281015442116100b9576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120600281015460068201549192909190829003610130576040517f4f231d2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088301541561016c576040517f3f943e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600301548361017e9190610972565b9050600061018c8287610773565b9050600061019a82886107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048901805492935083929091906101f7908490610985565b92505081905550808760060160008282546102129190610972565b90915550506016546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b49190610998565b5085546000906102c5908690610972565b6015546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015610340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103649190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8b16918c917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350505050505050505050565b6103cf600033610710565b60008281526004602052604090206002810154421161041a576040517f3fa01af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160005b8181101561070957600084828151811061043b5761043b6109ba565b602090810291909101810151600088815260058352604080822073ffffffffffffffffffffffffffffffffffffffff84168352909352918220600281015460068201549294509092909190829003610496575050505061041f565b6008830154156104a9575050505061041f565b60008360030154836104bb9190610972565b905060006104c9828a610773565b905060006104d7828b6107a4565b60088701819055600a870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000600688018190556007880181905560048c0180549293508392909190610534908490610985565b92505081905550808a600601600082825461054f9190610972565b90915550506016546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156105cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f19190610998565b508554600090610602908690610972565b6015546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af115801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a19190610998565b50604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8a16918f917fd27486cbbd902c694ff070c4b52eb23c8f7828d3688bd3c7293638daec288808910160405180910390a350506001909601955061041f945050505050565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff1661076f576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6007810154600090818161078f86670de0b6b3a76400006109e9565b6107999190610a00565b925050505b92915050565b6000670de0b6b3a76400008383600301546107bf91906109e9565b6107c99190610a00565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107f457600080fd5b919050565b6000806040838503121561080c57600080fd5b8235915061081c602084016107d0565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561086757600080fd5b8235915060208084013567ffffffffffffffff8082111561088757600080fd5b818601915086601f83011261089b57600080fd5b8135818111156108ad576108ad610825565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156108f0576108f0610825565b60405291825284820192508381018501918983111561090e57600080fd5b938501935b8285101561093357610924856107d0565b84529385019392850192610913565b8096505050505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079e5761079e610943565b8181038181111561079e5761079e610943565b6000602082840312156109aa57600080fd5b815180151581146107c957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808202811582820484141761079e5761079e610943565b600082610a36577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea264697066735822122066f4cad131397d768cf6346cbde7862375e1dd99db0af404046466acb749cb4164736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -103,7 +103,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0xc9068e2CfCA201717D5ACc1E990365600bAc919b" + "address": "0x548B923D4388e25F4449C6544bF5A2622620B78C" }, "hardhat": { "artifact": { diff --git a/deployments/DepositFacet.json b/deployments/DepositFacet.json index 4a43c7e..7a1d50b 100644 --- a/deployments/DepositFacet.json +++ b/deployments/DepositFacet.json @@ -69,8 +69,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610539806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b6b55f2514610030575b600080fd5b61004361003e3660046103fb565b610045565b005b601b54600203610081576040517f50bf8f2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002601b81905560175490546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9092169182906370a0823190602401602060405180830381865afa1580156100fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011e9190610414565b831115610157576040517f8dd4747600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600560209081526040808320338452825280832060098101548452601290925290912054815461018d90869061045c565b11156101c5576040517fda9e267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000036101d5574260048201555b3360009081526008602052604090208290556101f28483836102d2565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff8416906323b872dd906064016020604051808303816000875af115801561026b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028f9190610475565b50604051848152339083907feaa18152488ce5959073c9c79c88ca90b3d96c00de1f118cfaad664c3dab06b99060200160405180910390a350506001601b555050565b6000828152600460205260409020600281015442111561031e576040517f20c02df000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062015180428360020154610334919061049e565b61033e91906104b1565b90508060000361037a576040517f4086629900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8483600001600082825461038e919061045c565b9091555061039e905081866104ec565b8360020160008282546103b1919061045c565b92505081905550848260050160008282546103cc919061045c565b909155506103dc905081866104ec565b8260070160008282546103ef919061045c565b90915550505050505050565b60006020828403121561040d57600080fd5b5035919050565b60006020828403121561042657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561046f5761046f61042d565b92915050565b60006020828403121561048757600080fd5b8151801515811461049757600080fd5b9392505050565b8181038181111561046f5761046f61042d565b6000826104e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761046f5761046f61042d56fea2646970667358221220dd66ee540c1842bcce6c3ecbdb2ad13b5f82196a13c81cf4d7dd4bd9d6f83c6f64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b6b55f2514610030575b600080fd5b61004361003e3660046103fb565b610045565b005b601b54600203610081576040517f50bf8f2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002601b81905560175490546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9092169182906370a0823190602401602060405180830381865afa1580156100fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011e9190610414565b831115610157576040517f8dd4747600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600560209081526040808320338452825280832060098101548452601290925290912054815461018d90869061045c565b11156101c5576040517fda9e267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000036101d5574260048201555b3360009081526008602052604090208290556101f28483836102d2565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff8416906323b872dd906064016020604051808303816000875af115801561026b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028f9190610475565b50604051848152339083907feaa18152488ce5959073c9c79c88ca90b3d96c00de1f118cfaad664c3dab06b99060200160405180910390a350506001601b555050565b6000828152600460205260409020600281015442111561031e576040517f20c02df000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062015180428360020154610334919061049e565b61033e91906104b1565b90508060000361037a576040517f4086629900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8483600001600082825461038e919061045c565b9091555061039e905081866104ec565b8360020160008282546103b1919061045c565b92505081905550848260050160008282546103cc919061045c565b909155506103dc905081866104ec565b8260070160008282546103ef919061045c565b90915550505050505050565b60006020828403121561040d57600080fd5b5035919050565b60006020828403121561042657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561046f5761046f61042d565b92915050565b60006020828403121561048757600080fd5b8151801515811461049757600080fd5b9392505050565b8181038181111561046f5761046f61042d565b6000826104e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761046f5761046f61042d56fea2646970667358221220dd66ee540c1842bcce6c3ecbdb2ad13b5f82196a13c81cf4d7dd4bd9d6f83c6f64736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b50610539806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b6b55f2514610030575b600080fd5b61004361003e3660046103fb565b610045565b005b601954600203610081576040517f50bf8f2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002601981905560155490546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9092169182906370a0823190602401602060405180830381865afa1580156100fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011e9190610414565b831115610157576040517f8dd4747600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600560209081526040808320338452825280832060098101548452601290925290912054815461018d90869061045c565b11156101c5576040517fda9e267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000036101d5574260048201555b3360009081526008602052604090208290556101f28483836102d2565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff8416906323b872dd906064016020604051808303816000875af115801561026b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028f9190610475565b50604051848152339083907feaa18152488ce5959073c9c79c88ca90b3d96c00de1f118cfaad664c3dab06b99060200160405180910390a3505060016019555050565b6000828152600460205260409020600281015442111561031e576040517f20c02df000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062015180428360020154610334919061049e565b61033e91906104b1565b90508060000361037a576040517f4086629900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8483600001600082825461038e919061045c565b9091555061039e905081866104ec565b8360020160008282546103b1919061045c565b92505081905550848260050160008282546103cc919061045c565b909155506103dc905081866104ec565b8260070160008282546103ef919061045c565b90915550505050505050565b60006020828403121561040d57600080fd5b5035919050565b60006020828403121561042657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561046f5761046f61042d565b92915050565b60006020828403121561048757600080fd5b8151801515811461049757600080fd5b9392505050565b8181038181111561046f5761046f61042d565b6000826104e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761046f5761046f61042d56fea2646970667358221220f61b6eaf9b8a2ed239043acff6dafae9a5659ab9167f0f2969db33695806fd0864736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b6b55f2514610030575b600080fd5b61004361003e3660046103fb565b610045565b005b601954600203610081576040517f50bf8f2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002601981905560155490546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9092169182906370a0823190602401602060405180830381865afa1580156100fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011e9190610414565b831115610157576040517f8dd4747600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600560209081526040808320338452825280832060098101548452601290925290912054815461018d90869061045c565b11156101c5576040517fda9e267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546000036101d5574260048201555b3360009081526008602052604090208290556101f28483836102d2565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff8416906323b872dd906064016020604051808303816000875af115801561026b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028f9190610475565b50604051848152339083907feaa18152488ce5959073c9c79c88ca90b3d96c00de1f118cfaad664c3dab06b99060200160405180910390a3505060016019555050565b6000828152600460205260409020600281015442111561031e576040517f20c02df000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062015180428360020154610334919061049e565b61033e91906104b1565b90508060000361037a576040517f4086629900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8483600001600082825461038e919061045c565b9091555061039e905081866104ec565b8360020160008282546103b1919061045c565b92505081905550848260050160008282546103cc919061045c565b909155506103dc905081866104ec565b8260070160008282546103ef919061045c565b90915550505050505050565b60006020828403121561040d57600080fd5b5035919050565b60006020828403121561042657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561046f5761046f61042d565b92915050565b60006020828403121561048757600080fd5b8151801515811461049757600080fd5b9392505050565b8181038181111561046f5761046f61042d565b6000826104e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761046f5761046f61042d56fea2646970667358221220f61b6eaf9b8a2ed239043acff6dafae9a5659ab9167f0f2969db33695806fd0864736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -79,7 +79,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0xf52265Beab3CcC21143a59926Fbd51528D9b70e8" + "address": "0x3F7b438d9f6724222D86B21d7d348D4fBb74aDa9" }, "hardhat": { "artifact": { diff --git a/deployments/DiamondManagerFacet.json b/deployments/DiamondManagerFacet.json index 8e7a3b6..6c401cf 100644 --- a/deployments/DiamondManagerFacet.json +++ b/deployments/DiamondManagerFacet.json @@ -1646,8 +1646,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061336a806100206000396000f3fe608060405234801561001057600080fd5b506004361061038e5760003560e01c8063830f4cb1116101de578063b5e007901161010f578063df409589116100ad578063f55484ac1161007c578063f55484ac14610a53578063f557f1a914610a66578063fca7129f14610a79578063fe17bd2b14610a9c57600080fd5b8063df40958914610a1a578063e5ea3fdc14610594578063e856611814610a2d578063f008911114610a4057600080fd5b8063d18b3d90116100e9578063d18b3d9014610966578063d2b291d1146109ae578063d822bb87146109f4578063dbcbb9a314610a0757600080fd5b8063b5e0079014610906578063bc67f25f14610919578063c4882ed71461092157600080fd5b80639d0b7d5a1161017c578063ae178fda11610156578063ae178fda1461081c578063b150387914610861578063b234c9c4146108a6578063b3afe496146108b957600080fd5b80639d0b7d5a146107d25780639d6c100f146107e5578063a07693eb1461080957600080fd5b80638aee8127116101b85780638aee81271461075a578063947b43f41461076d57806395e2de331461078d5780639a56f4e41461063157600080fd5b8063830f4cb11461072b57806385e3f9971461073e5780638a91af171461074757600080fd5b80633e131a7a116102c35780635e75a6c3116102615780636e06c64d116102305780636e06c64d1461067c57806373ad27b01461068f578063753b8ece14610703578063820d0ad71461072357600080fd5b80635e75a6c3146105ca57806361ccdfba146105d257806366e017c3146106315780636bb70f6a1461065457600080fd5b80634dc0cd2b1161029d5780634dc0cd2b1461053f578063560cf6f514610581578063562b7153146105945780635c1624ab146105b757600080fd5b80633e131a7a146105065780634784f6bc146105195780634a477b141461052c57600080fd5b80632d4136a6116103305780633361e38b1161030a5780633361e38b146104b557806336a4a844146104c85780633940acb4146104db5780633d55b37b146104e357600080fd5b80632d4136a61461044a5780632e11ca8b1461047d5780633175cbe81461049257600080fd5b8063142950d61161036c578063142950d6146103fc578063275b629e14610404578063278a93e2146104175780632c5682eb1461042a57600080fd5b80630c4ed799146103935780630c7d72a7146103a85780630cc1687a146103db575b600080fd5b6103a66103a1366004612cf9565b610abc565b005b6103bb6103b6366004612cf9565b610bea565b604080519384526020840192909252908201526060015b60405180910390f35b6103ee6103e9366004612d14565b610db2565b6040519081526020016103d2565b6103a6610de3565b6103a6610412366004612d2d565b610e68565b6103a6610425366004612d4f565b610f2c565b61043d610438366004612cf9565b6110e6565b6040516103d29190612dc4565b61046d610458366004612d14565b6000908152601e602052604090205460ff1690565b60405190151581526020016103d2565b6104856111f9565b6040516103d29190612e86565b6103ee6104a0366004612d14565b60009081526004602052604090206005015490565b6103a66104c3366004612fa6565b61126a565b6103a66104d6366004613066565b6113f0565b6016546103ee565b6103ee6104f1366004612d14565b60009081526004602052604090206002015490565b6103a6610514366004612d4f565b611552565b6103a6610527366004612d14565b61167c565b6103ee61053a36600461309c565b61171f565b6103ee61054d36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b6103a661058f366004612d2d565b611759565b6103ee6105a2366004612d14565b60009081526004602052604090206003015490565b6103a66105c5366004612fa6565b61186c565b6002546103ee565b61061c6105e036600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080546002909101549091565b604080519283526020830191909152016103d2565b6103ee61063f366004612d14565b60009081526004602052604090206007015490565b601a5460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103d2565b6103a661068a366004612fa6565b611a50565b6106a261069d366004612d14565b611bd6565b6040516103d29190600061010082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6103ee610711366004612d14565b60009081526015602052604090205490565b6106a2611c8b565b6103a6610739366004612d2d565b611d42565b6103ee61271081565b6103a6610755366004612d14565b611ef2565b6103a6610768366004612cf9565b611fda565b6103ee61077b366004612d14565b60009081526011602052604090205490565b6103ee61079b36600461309c565b600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff959095168452939052919020015490565b6103a66107e0366004612d2d565b6120e0565b6103ee6107f3366004612d14565b6000908152600460208190526040909120015490565b61043d61081736600461309c565b61219f565b6103ee61082a36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206006015490565b6103ee61086f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206007015490565b6103a66108b4366004612fa6565b6122b1565b61061c6108c736600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522060028101546003909101549091565b6103a66109143660046130c6565b612437565b6103a66124c3565b6103ee61092f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206008015490565b61046d61097436600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292905220600a015460ff1690565b6103ee6109bc3660046130f2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260106020908152604080832093909416825291909152205490565b6103ee610a02366004613125565b6125c0565b6103a6610a15366004612d2d565b612604565b6103a6610a28366004612d14565b6126b9565b6103a6610a3b366004612cf9565b612804565b6103a6610a4e366004612d14565b612930565b6103a6610a61366004612cf9565b612a11565b6103a6610a74366004612cf9565b612b3f565b6103ee610a87366004612d14565b60009081526004602052604090206006015490565b6103ee610aaa366004612d14565b60009081526012602052604090205490565b8073ffffffffffffffffffffffffffffffffffffffff8116610b0a576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610b7a576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fa95ef02bd478750565871921654c3eae0063151ae6f3e9824a5d52fd395d016e90600090a25050565b6000806000806000600201549050600080600501600083815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518061016001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900460ff1615151515815250509050600080600401600084815260200190815260200160002060405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815250509050600082606001518360400151610d649190613177565b835160e0840151909850909150610d7d8261271061318a565b610d8791906131a1565b9550612710868360600151610d9c919061318a565b610da691906131a1565b96989597505050505050565b60008181526015602052604081205460165461271090610dd2908361318a565b610ddc91906131a1565b9392505050565b3360009081526020819052604090205460ff16610e2c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546000908152601e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610ed8576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040908190206002018290555182907f4116cb3bf93ca69e12f15dddabaac80513467c175e1a2fbe7b4ac863ab701fc190610f209084815260200190565b60405180910390a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610f9c576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b8114610fd6576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60165460005b600b8110156110a75760008181526015602052604081205490612710611002858461318a565b61100c91906131a1565b905060008311801561103557508086868581811061102c5761102c6131dc565b90506020020135105b1561106c576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85858481811061107e5761107e6131dc565b600086815260116020908152604090912091029290920135909155505060019091019050610fdc565b507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c83836040516110d992919061320b565b60405180910390a1505050565b611145604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5060028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff90961684529481529184902084516101608101865281548152600182015493810193909352928301549382019390935260038201546060820152600482015460808201529181015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a015460ff16151561014082015290565b60408051600b808252610180820190925260609160009190602082016101608036833701905050905060005b600b811015611264576000818152601160205260409020548251839083908110611251576112516131dc565b6020908102919091010152600101611225565b50919050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146112da576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611315576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b825181101561135b57828181518110611334576113346131dc565b6020026020010151826113479190613177565b9150806113538161325d565b915050611319565b506127108114611397576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516113aa906009906020860190612bf6565b5081516113be90600a906020850190612c80565b507fbd58a823390daa65d99f8a8b381a804509e21c2078db13de15849c3edaa9a95583836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611460576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061148357506000818152600460205260409020600201544211155b156114ba576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c5816001613177565b600281905560008181526004602052604090209081554260018201556114f160ff841662015180613302565b6115009062ffffff1642613177565b6002828101919091556003820185905560048201859055546040518581527f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906020015b60405180910390a250505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146115c2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b81146115fc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600b81101561163e5782828281811061161a5761161a6131dc565b600084815260156020908152604090912091029290920135909155506001016115ff565b507f7bcea34b82e222069291852af10dd0ce9909b890c8e851c52fd83de87883093d828260405161167092919061320b565b60405180910390a15050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146116ec576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281905560405181907f62fa44befc82da349c4e192c274524ec83957f8cad2344147faac6bbbd3aca9e90600090a250565b600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020600201545b92915050565b3360009081526020819052604090205460ff166117a2576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025480158015906117c557506000818152600460205260409020600201544211155b156117fc576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611807816001613177565b6002818155600082815260046020819052604091829020938455426001850155838301869055600384018790558301869055905490517f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906115449087815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146118dc576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611917576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090815b8451811015611a235760008281526005602052604081208651829088908590811061194c5761194c6131dc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008583815181106119a4576119a46131dc565b6020026020010151905081600001546000036119ec576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038201546119fb8282613321565b611a059087613177565b60039093019190915550925080611a1b8161325d565b91505061191f565b5060008181526004602052604081206007018054849290611a45908490613321565b909155505050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611ac0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611afb576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015611b4157828181518110611b1a57611b1a6131dc565b602002602001015182611b2d9190613177565b915080611b398161325d565b915050611aff565b506127108114611b7d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251611b9090600e906020860190612bf6565b508151611ba490600f906020850190612c80565b507f622860cbd141acea4430d275509fb57c7a9e332d2958c44b1821730b3778a1df83836040516110d9929190613295565b611c1e60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000908152600460208181526040928390208351610100810185528154815260018201549281019290925260028101549382019390935260038301546060820152908201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b611cd360405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060028054600090815260046020818152604092839020835161010081018552815481526001820154928101929092529384015492810192909252600383015460608301528201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611db2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a821115611ded576040517fcbbe0f4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526015602052604081205460165490919061271090611e10908461318a565b611e1a91906131a1565b9050600084118015611e2b57508083105b15611e62576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526011602052604080822085905580516001808252818301909252908160200160208202803683370190505090508381600081518110611ea857611ea86131dc565b6020026020010181815250507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c81604051611ee39190612e86565b60405180910390a15050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611f62576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115611f9e576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068190556040518181527f858248b1156bac790ae06ed47561d905c1dfe56347b61de29930c266eb2a1683906020015b60405180910390a150565b8073ffffffffffffffffffffffffffffffffffffffff8116612028576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612098576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50601880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612150576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b623d090081111561218d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000918252600c602052604090912055565b6121fe604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b50600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff9590951684529381529183902083516101608101855281548152600182015493810193909352600281015493830193909352600383015460608301526004830154608083015282015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a9091015460ff16151561014082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612321576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805182511461235c576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b82518110156123a25782818151811061237b5761237b6131dc565b60200260200101518261238e9190613177565b91508061239a8161325d565b915050612360565b5061271081146123de576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516123f1906013906020860190612bf6565b508151612405906014906020850190612c80565b507fdabc66011f68fc990a5a3b502413fcfcd16c0788b1017255c8fa0745a2954cb283836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146124a7576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000928352600d60209081526040808520938552929052912055565b3360009081526020819052604090205460ff1661250c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c54604080517f4fb85e18000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fb85e189160048082019260009290919082900301818387803b15801561257857600080fd5b505af115801561258c573d6000803e3d6000fd5b50506002546040519092507f83a7e21afbe67d7255378f6b4496052f066f91c138d8e5c40602e63fe85f3b429150600090a2565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281206003810154600290910154610ddc9190613177565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612674576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260076020526040908190208290555182907f8c5a04c32672ff89885a8de60723fe6ed9a293306cca3db58a1667056ebdab8990610f209084815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612729576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061274c57506000818152600460205260409020600201544211155b15612783576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612790826001613177565b600281905560008181526004602052604090208181554260018201819055919250906127bf906220f580613177565b6002820155600381018490556004810184905560405184815282907f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c90602001611544565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612874576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166128c1576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f7577407244e1eac6eec66ebaf9dc9ddb86aefcb50adde27d0b89b689f73b292590600090a250565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146129a0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156129dc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60168190556040518181527f585b544b2d9ebfba0b4030c5b12086c7e40b39d2bf7317868b70dad5a8fd06cc90602001611fcf565b8073ffffffffffffffffffffffffffffffffffffffff8116612a5f576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612acf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fba869e26b357347347ed9cc2f9f7c35185ded23c70d83aa3e3f1d339382c7bbd90600090a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612baf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c7057825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190612c16565b50612c7c929150612cbb565b5090565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c70578251825591602001919060010190612ca0565b5b80821115612c7c5760008155600101612cbc565b803573ffffffffffffffffffffffffffffffffffffffff81168114612cf457600080fd5b919050565b600060208284031215612d0b57600080fd5b610ddc82612cd0565b600060208284031215612d2657600080fd5b5035919050565b60008060408385031215612d4057600080fd5b50508035926020909101359150565b60008060208385031215612d6257600080fd5b823567ffffffffffffffff80821115612d7a57600080fd5b818501915085601f830112612d8e57600080fd5b813581811115612d9d57600080fd5b8660208260051b8501011115612db257600080fd5b60209290920196919550909350505050565b600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151612e438285018215159052565b505092915050565b600081518084526020808501945080840160005b83811015612e7b57815187529582019590820190600101612e5f565b509495945050505050565b602081526000610ddc6020830184612e4b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f0f57612f0f612e99565b604052919050565b600067ffffffffffffffff821115612f3157612f31612e99565b5060051b60200190565b600082601f830112612f4c57600080fd5b81356020612f61612f5c83612f17565b612ec8565b82815260059290921b84018101918181019086841115612f8057600080fd5b8286015b84811015612f9b5780358352918301918301612f84565b509695505050505050565b60008060408385031215612fb957600080fd5b823567ffffffffffffffff80821115612fd157600080fd5b818501915085601f830112612fe557600080fd5b81356020612ff5612f5c83612f17565b82815260059290921b8401810191818101908984111561301457600080fd5b948201945b838610156130395761302a86612cd0565b82529482019490820190613019565b9650508601359250508082111561304f57600080fd5b5061305c85828601612f3b565b9150509250929050565b6000806040838503121561307957600080fd5b82359150602083013560ff8116811461309157600080fd5b809150509250929050565b600080604083850312156130af57600080fd5b6130b883612cd0565b946020939093013593505050565b6000806000606084860312156130db57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561310557600080fd5b61310e83612cd0565b915061311c60208401612cd0565b90509250929050565b6000806040838503121561313857600080fd5b8235915061311c60208401612cd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561175357611753613148565b808202811582820484141761175357611753613148565b6000826131d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561324457600080fd5b8260051b80856040850137919091016040019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361328e5761328e613148565b5060010190565b604080825283519082018190526000906020906060840190828701845b828110156132e457815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016132b2565b505050838103828501526132f88186612e4b565b9695505050505050565b62ffffff818116838216028082169190828114612e4357612e43613148565b818103818111156117535761175361314856fea2646970667358221220a7bbf270b56dceb25cc72e77dbea001cc2115d4f67bed66b6a1492e299e8629d64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061038e5760003560e01c8063830f4cb1116101de578063b5e007901161010f578063df409589116100ad578063f55484ac1161007c578063f55484ac14610a53578063f557f1a914610a66578063fca7129f14610a79578063fe17bd2b14610a9c57600080fd5b8063df40958914610a1a578063e5ea3fdc14610594578063e856611814610a2d578063f008911114610a4057600080fd5b8063d18b3d90116100e9578063d18b3d9014610966578063d2b291d1146109ae578063d822bb87146109f4578063dbcbb9a314610a0757600080fd5b8063b5e0079014610906578063bc67f25f14610919578063c4882ed71461092157600080fd5b80639d0b7d5a1161017c578063ae178fda11610156578063ae178fda1461081c578063b150387914610861578063b234c9c4146108a6578063b3afe496146108b957600080fd5b80639d0b7d5a146107d25780639d6c100f146107e5578063a07693eb1461080957600080fd5b80638aee8127116101b85780638aee81271461075a578063947b43f41461076d57806395e2de331461078d5780639a56f4e41461063157600080fd5b8063830f4cb11461072b57806385e3f9971461073e5780638a91af171461074757600080fd5b80633e131a7a116102c35780635e75a6c3116102615780636e06c64d116102305780636e06c64d1461067c57806373ad27b01461068f578063753b8ece14610703578063820d0ad71461072357600080fd5b80635e75a6c3146105ca57806361ccdfba146105d257806366e017c3146106315780636bb70f6a1461065457600080fd5b80634dc0cd2b1161029d5780634dc0cd2b1461053f578063560cf6f514610581578063562b7153146105945780635c1624ab146105b757600080fd5b80633e131a7a146105065780634784f6bc146105195780634a477b141461052c57600080fd5b80632d4136a6116103305780633361e38b1161030a5780633361e38b146104b557806336a4a844146104c85780633940acb4146104db5780633d55b37b146104e357600080fd5b80632d4136a61461044a5780632e11ca8b1461047d5780633175cbe81461049257600080fd5b8063142950d61161036c578063142950d6146103fc578063275b629e14610404578063278a93e2146104175780632c5682eb1461042a57600080fd5b80630c4ed799146103935780630c7d72a7146103a85780630cc1687a146103db575b600080fd5b6103a66103a1366004612cf9565b610abc565b005b6103bb6103b6366004612cf9565b610bea565b604080519384526020840192909252908201526060015b60405180910390f35b6103ee6103e9366004612d14565b610db2565b6040519081526020016103d2565b6103a6610de3565b6103a6610412366004612d2d565b610e68565b6103a6610425366004612d4f565b610f2c565b61043d610438366004612cf9565b6110e6565b6040516103d29190612dc4565b61046d610458366004612d14565b6000908152601e602052604090205460ff1690565b60405190151581526020016103d2565b6104856111f9565b6040516103d29190612e86565b6103ee6104a0366004612d14565b60009081526004602052604090206005015490565b6103a66104c3366004612fa6565b61126a565b6103a66104d6366004613066565b6113f0565b6016546103ee565b6103ee6104f1366004612d14565b60009081526004602052604090206002015490565b6103a6610514366004612d4f565b611552565b6103a6610527366004612d14565b61167c565b6103ee61053a36600461309c565b61171f565b6103ee61054d36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b6103a661058f366004612d2d565b611759565b6103ee6105a2366004612d14565b60009081526004602052604090206003015490565b6103a66105c5366004612fa6565b61186c565b6002546103ee565b61061c6105e036600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080546002909101549091565b604080519283526020830191909152016103d2565b6103ee61063f366004612d14565b60009081526004602052604090206007015490565b601a5460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103d2565b6103a661068a366004612fa6565b611a50565b6106a261069d366004612d14565b611bd6565b6040516103d29190600061010082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6103ee610711366004612d14565b60009081526015602052604090205490565b6106a2611c8b565b6103a6610739366004612d2d565b611d42565b6103ee61271081565b6103a6610755366004612d14565b611ef2565b6103a6610768366004612cf9565b611fda565b6103ee61077b366004612d14565b60009081526011602052604090205490565b6103ee61079b36600461309c565b600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff959095168452939052919020015490565b6103a66107e0366004612d2d565b6120e0565b6103ee6107f3366004612d14565b6000908152600460208190526040909120015490565b61043d61081736600461309c565b61219f565b6103ee61082a36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206006015490565b6103ee61086f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206007015490565b6103a66108b4366004612fa6565b6122b1565b61061c6108c736600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522060028101546003909101549091565b6103a66109143660046130c6565b612437565b6103a66124c3565b6103ee61092f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206008015490565b61046d61097436600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292905220600a015460ff1690565b6103ee6109bc3660046130f2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260106020908152604080832093909416825291909152205490565b6103ee610a02366004613125565b6125c0565b6103a6610a15366004612d2d565b612604565b6103a6610a28366004612d14565b6126b9565b6103a6610a3b366004612cf9565b612804565b6103a6610a4e366004612d14565b612930565b6103a6610a61366004612cf9565b612a11565b6103a6610a74366004612cf9565b612b3f565b6103ee610a87366004612d14565b60009081526004602052604090206006015490565b6103ee610aaa366004612d14565b60009081526012602052604090205490565b8073ffffffffffffffffffffffffffffffffffffffff8116610b0a576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610b7a576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fa95ef02bd478750565871921654c3eae0063151ae6f3e9824a5d52fd395d016e90600090a25050565b6000806000806000600201549050600080600501600083815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518061016001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900460ff1615151515815250509050600080600401600084815260200190815260200160002060405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815250509050600082606001518360400151610d649190613177565b835160e0840151909850909150610d7d8261271061318a565b610d8791906131a1565b9550612710868360600151610d9c919061318a565b610da691906131a1565b96989597505050505050565b60008181526015602052604081205460165461271090610dd2908361318a565b610ddc91906131a1565b9392505050565b3360009081526020819052604090205460ff16610e2c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546000908152601e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610ed8576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040908190206002018290555182907f4116cb3bf93ca69e12f15dddabaac80513467c175e1a2fbe7b4ac863ab701fc190610f209084815260200190565b60405180910390a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610f9c576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b8114610fd6576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60165460005b600b8110156110a75760008181526015602052604081205490612710611002858461318a565b61100c91906131a1565b905060008311801561103557508086868581811061102c5761102c6131dc565b90506020020135105b1561106c576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85858481811061107e5761107e6131dc565b600086815260116020908152604090912091029290920135909155505060019091019050610fdc565b507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c83836040516110d992919061320b565b60405180910390a1505050565b611145604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5060028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff90961684529481529184902084516101608101865281548152600182015493810193909352928301549382019390935260038201546060820152600482015460808201529181015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a015460ff16151561014082015290565b60408051600b808252610180820190925260609160009190602082016101608036833701905050905060005b600b811015611264576000818152601160205260409020548251839083908110611251576112516131dc565b6020908102919091010152600101611225565b50919050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146112da576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611315576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b825181101561135b57828181518110611334576113346131dc565b6020026020010151826113479190613177565b9150806113538161325d565b915050611319565b506127108114611397576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516113aa906009906020860190612bf6565b5081516113be90600a906020850190612c80565b507fbd58a823390daa65d99f8a8b381a804509e21c2078db13de15849c3edaa9a95583836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611460576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061148357506000818152600460205260409020600201544211155b156114ba576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c5816001613177565b600281905560008181526004602052604090209081554260018201556114f160ff841662015180613302565b6115009062ffffff1642613177565b6002828101919091556003820185905560048201859055546040518581527f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906020015b60405180910390a250505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146115c2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b81146115fc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600b81101561163e5782828281811061161a5761161a6131dc565b600084815260156020908152604090912091029290920135909155506001016115ff565b507f7bcea34b82e222069291852af10dd0ce9909b890c8e851c52fd83de87883093d828260405161167092919061320b565b60405180910390a15050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146116ec576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281905560405181907f62fa44befc82da349c4e192c274524ec83957f8cad2344147faac6bbbd3aca9e90600090a250565b600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020600201545b92915050565b3360009081526020819052604090205460ff166117a2576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025480158015906117c557506000818152600460205260409020600201544211155b156117fc576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611807816001613177565b6002818155600082815260046020819052604091829020938455426001850155838301869055600384018790558301869055905490517f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906115449087815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146118dc576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611917576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090815b8451811015611a235760008281526005602052604081208651829088908590811061194c5761194c6131dc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008583815181106119a4576119a46131dc565b6020026020010151905081600001546000036119ec576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038201546119fb8282613321565b611a059087613177565b60039093019190915550925080611a1b8161325d565b91505061191f565b5060008181526004602052604081206007018054849290611a45908490613321565b909155505050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611ac0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611afb576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015611b4157828181518110611b1a57611b1a6131dc565b602002602001015182611b2d9190613177565b915080611b398161325d565b915050611aff565b506127108114611b7d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251611b9090600e906020860190612bf6565b508151611ba490600f906020850190612c80565b507f622860cbd141acea4430d275509fb57c7a9e332d2958c44b1821730b3778a1df83836040516110d9929190613295565b611c1e60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000908152600460208181526040928390208351610100810185528154815260018201549281019290925260028101549382019390935260038301546060820152908201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b611cd360405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060028054600090815260046020818152604092839020835161010081018552815481526001820154928101929092529384015492810192909252600383015460608301528201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611db2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a821115611ded576040517fcbbe0f4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526015602052604081205460165490919061271090611e10908461318a565b611e1a91906131a1565b9050600084118015611e2b57508083105b15611e62576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526011602052604080822085905580516001808252818301909252908160200160208202803683370190505090508381600081518110611ea857611ea86131dc565b6020026020010181815250507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c81604051611ee39190612e86565b60405180910390a15050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611f62576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115611f9e576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068190556040518181527f858248b1156bac790ae06ed47561d905c1dfe56347b61de29930c266eb2a1683906020015b60405180910390a150565b8073ffffffffffffffffffffffffffffffffffffffff8116612028576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612098576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50601880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612150576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b623d090081111561218d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000918252600c602052604090912055565b6121fe604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b50600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff9590951684529381529183902083516101608101855281548152600182015493810193909352600281015493830193909352600383015460608301526004830154608083015282015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a9091015460ff16151561014082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612321576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805182511461235c576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b82518110156123a25782818151811061237b5761237b6131dc565b60200260200101518261238e9190613177565b91508061239a8161325d565b915050612360565b5061271081146123de576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516123f1906013906020860190612bf6565b508151612405906014906020850190612c80565b507fdabc66011f68fc990a5a3b502413fcfcd16c0788b1017255c8fa0745a2954cb283836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146124a7576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000928352600d60209081526040808520938552929052912055565b3360009081526020819052604090205460ff1661250c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c54604080517f4fb85e18000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fb85e189160048082019260009290919082900301818387803b15801561257857600080fd5b505af115801561258c573d6000803e3d6000fd5b50506002546040519092507f83a7e21afbe67d7255378f6b4496052f066f91c138d8e5c40602e63fe85f3b429150600090a2565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281206003810154600290910154610ddc9190613177565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612674576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260076020526040908190208290555182907f8c5a04c32672ff89885a8de60723fe6ed9a293306cca3db58a1667056ebdab8990610f209084815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612729576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061274c57506000818152600460205260409020600201544211155b15612783576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612790826001613177565b600281905560008181526004602052604090208181554260018201819055919250906127bf906220f580613177565b6002820155600381018490556004810184905560405184815282907f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c90602001611544565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612874576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166128c1576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f7577407244e1eac6eec66ebaf9dc9ddb86aefcb50adde27d0b89b689f73b292590600090a250565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146129a0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156129dc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60168190556040518181527f585b544b2d9ebfba0b4030c5b12086c7e40b39d2bf7317868b70dad5a8fd06cc90602001611fcf565b8073ffffffffffffffffffffffffffffffffffffffff8116612a5f576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612acf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fba869e26b357347347ed9cc2f9f7c35185ded23c70d83aa3e3f1d339382c7bbd90600090a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612baf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c7057825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190612c16565b50612c7c929150612cbb565b5090565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c70578251825591602001919060010190612ca0565b5b80821115612c7c5760008155600101612cbc565b803573ffffffffffffffffffffffffffffffffffffffff81168114612cf457600080fd5b919050565b600060208284031215612d0b57600080fd5b610ddc82612cd0565b600060208284031215612d2657600080fd5b5035919050565b60008060408385031215612d4057600080fd5b50508035926020909101359150565b60008060208385031215612d6257600080fd5b823567ffffffffffffffff80821115612d7a57600080fd5b818501915085601f830112612d8e57600080fd5b813581811115612d9d57600080fd5b8660208260051b8501011115612db257600080fd5b60209290920196919550909350505050565b600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151612e438285018215159052565b505092915050565b600081518084526020808501945080840160005b83811015612e7b57815187529582019590820190600101612e5f565b509495945050505050565b602081526000610ddc6020830184612e4b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f0f57612f0f612e99565b604052919050565b600067ffffffffffffffff821115612f3157612f31612e99565b5060051b60200190565b600082601f830112612f4c57600080fd5b81356020612f61612f5c83612f17565b612ec8565b82815260059290921b84018101918181019086841115612f8057600080fd5b8286015b84811015612f9b5780358352918301918301612f84565b509695505050505050565b60008060408385031215612fb957600080fd5b823567ffffffffffffffff80821115612fd157600080fd5b818501915085601f830112612fe557600080fd5b81356020612ff5612f5c83612f17565b82815260059290921b8401810191818101908984111561301457600080fd5b948201945b838610156130395761302a86612cd0565b82529482019490820190613019565b9650508601359250508082111561304f57600080fd5b5061305c85828601612f3b565b9150509250929050565b6000806040838503121561307957600080fd5b82359150602083013560ff8116811461309157600080fd5b809150509250929050565b600080604083850312156130af57600080fd5b6130b883612cd0565b946020939093013593505050565b6000806000606084860312156130db57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561310557600080fd5b61310e83612cd0565b915061311c60208401612cd0565b90509250929050565b6000806040838503121561313857600080fd5b8235915061311c60208401612cd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561175357611753613148565b808202811582820484141761175357611753613148565b6000826131d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561324457600080fd5b8260051b80856040850137919091016040019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361328e5761328e613148565b5060010190565b604080825283519082018190526000906020906060840190828701845b828110156132e457815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016132b2565b505050838103828501526132f88186612e4b565b9695505050505050565b62ffffff818116838216028082169190828114612e4357612e43613148565b818103818111156117535761175361314856fea2646970667358221220a7bbf270b56dceb25cc72e77dbea001cc2115d4f67bed66b6a1492e299e8629d64736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b5061336a806100206000396000f3fe608060405234801561001057600080fd5b506004361061038e5760003560e01c8063830f4cb1116101de578063b5e007901161010f578063df409589116100ad578063f55484ac1161007c578063f55484ac14610a53578063f557f1a914610a66578063fca7129f14610a79578063fe17bd2b14610a9c57600080fd5b8063df40958914610a1a578063e5ea3fdc14610594578063e856611814610a2d578063f008911114610a4057600080fd5b8063d18b3d90116100e9578063d18b3d9014610966578063d2b291d1146109ae578063d822bb87146109f4578063dbcbb9a314610a0757600080fd5b8063b5e0079014610906578063bc67f25f14610919578063c4882ed71461092157600080fd5b80639d0b7d5a1161017c578063ae178fda11610156578063ae178fda1461081c578063b150387914610861578063b234c9c4146108a6578063b3afe496146108b957600080fd5b80639d0b7d5a146107d25780639d6c100f146107e5578063a07693eb1461080957600080fd5b80638aee8127116101b85780638aee81271461075a578063947b43f41461076d57806395e2de331461078d5780639a56f4e41461063157600080fd5b8063830f4cb11461072b57806385e3f9971461073e5780638a91af171461074757600080fd5b80633e131a7a116102c35780635e75a6c3116102615780636e06c64d116102305780636e06c64d1461067c57806373ad27b01461068f578063753b8ece14610703578063820d0ad71461072357600080fd5b80635e75a6c3146105ca57806361ccdfba146105d257806366e017c3146106315780636bb70f6a1461065457600080fd5b80634dc0cd2b1161029d5780634dc0cd2b1461053f578063560cf6f514610581578063562b7153146105945780635c1624ab146105b757600080fd5b80633e131a7a146105065780634784f6bc146105195780634a477b141461052c57600080fd5b80632d4136a6116103305780633361e38b1161030a5780633361e38b146104b557806336a4a844146104c85780633940acb4146104db5780633d55b37b146104e357600080fd5b80632d4136a61461044a5780632e11ca8b1461047d5780633175cbe81461049257600080fd5b8063142950d61161036c578063142950d6146103fc578063275b629e14610404578063278a93e2146104175780632c5682eb1461042a57600080fd5b80630c4ed799146103935780630c7d72a7146103a85780630cc1687a146103db575b600080fd5b6103a66103a1366004612cf9565b610abc565b005b6103bb6103b6366004612cf9565b610bea565b604080519384526020840192909252908201526060015b60405180910390f35b6103ee6103e9366004612d14565b610db2565b6040519081526020016103d2565b6103a6610de3565b6103a6610412366004612d2d565b610e68565b6103a6610425366004612d4f565b610f2c565b61043d610438366004612cf9565b6110e6565b6040516103d29190612dc4565b61046d610458366004612d14565b6000908152601e602052604090205460ff1690565b60405190151581526020016103d2565b6104856111f9565b6040516103d29190612e86565b6103ee6104a0366004612d14565b60009081526004602052604090206005015490565b6103a66104c3366004612fa6565b61126a565b6103a66104d6366004613066565b6113f0565b601c546103ee565b6103ee6104f1366004612d14565b60009081526004602052604090206002015490565b6103a6610514366004612d4f565b611552565b6103a6610527366004612d14565b61167c565b6103ee61053a36600461309c565b61171f565b6103ee61054d36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b6103a661058f366004612d2d565b611759565b6103ee6105a2366004612d14565b60009081526004602052604090206003015490565b6103a66105c5366004612fa6565b61186c565b6002546103ee565b61061c6105e036600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080546002909101549091565b604080519283526020830191909152016103d2565b6103ee61063f366004612d14565b60009081526004602052604090206007015490565b60185460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103d2565b6103a661068a366004612fa6565b611a50565b6106a261069d366004612d14565b611bd6565b6040516103d29190600061010082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6103ee610711366004612d14565b6000908152601b602052604090205490565b6106a2611c8b565b6103a6610739366004612d2d565b611d42565b6103ee61271081565b6103a6610755366004612d14565b611ef2565b6103a6610768366004612cf9565b611fda565b6103ee61077b366004612d14565b60009081526011602052604090205490565b6103ee61079b36600461309c565b600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff959095168452939052919020015490565b6103a66107e0366004612d2d565b6120e0565b6103ee6107f3366004612d14565b6000908152600460208190526040909120015490565b61043d61081736600461309c565b61219f565b6103ee61082a36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206006015490565b6103ee61086f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206007015490565b6103a66108b4366004612fa6565b6122b1565b61061c6108c736600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522060028101546003909101549091565b6103a66109143660046130c6565b612437565b6103a66124c3565b6103ee61092f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206008015490565b61046d61097436600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292905220600a015460ff1690565b6103ee6109bc3660046130f2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260106020908152604080832093909416825291909152205490565b6103ee610a02366004613125565b6125c0565b6103a6610a15366004612d2d565b612604565b6103a6610a28366004612d14565b6126b9565b6103a6610a3b366004612cf9565b612804565b6103a6610a4e366004612d14565b612930565b6103a6610a61366004612cf9565b612a11565b6103a6610a74366004612cf9565b612b3f565b6103ee610a87366004612d14565b60009081526004602052604090206006015490565b6103ee610aaa366004612d14565b60009081526012602052604090205490565b8073ffffffffffffffffffffffffffffffffffffffff8116610b0a576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610b7a576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fa95ef02bd478750565871921654c3eae0063151ae6f3e9824a5d52fd395d016e90600090a25050565b6000806000806000600201549050600080600501600083815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518061016001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900460ff1615151515815250509050600080600401600084815260200190815260200160002060405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815250509050600082606001518360400151610d649190613177565b835160e0840151909850909150610d7d8261271061318a565b610d8791906131a1565b9550612710868360600151610d9c919061318a565b610da691906131a1565b96989597505050505050565b6000818152601b6020526040812054601c5461271090610dd2908361318a565b610ddc91906131a1565b9392505050565b3360009081526020819052604090205460ff16610e2c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546000908152601e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610ed8576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040908190206002018290555182907f4116cb3bf93ca69e12f15dddabaac80513467c175e1a2fbe7b4ac863ab701fc190610f209084815260200190565b60405180910390a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610f9c576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b8114610fd6576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c5460005b600b8110156110a7576000818152601b602052604081205490612710611002858461318a565b61100c91906131a1565b905060008311801561103557508086868581811061102c5761102c6131dc565b90506020020135105b1561106c576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85858481811061107e5761107e6131dc565b600086815260116020908152604090912091029290920135909155505060019091019050610fdc565b507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c83836040516110d992919061320b565b60405180910390a1505050565b611145604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5060028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff90961684529481529184902084516101608101865281548152600182015493810193909352928301549382019390935260038201546060820152600482015460808201529181015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a015460ff16151561014082015290565b60408051600b808252610180820190925260609160009190602082016101608036833701905050905060005b600b811015611264576000818152601160205260409020548251839083908110611251576112516131dc565b6020908102919091010152600101611225565b50919050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146112da576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611315576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b825181101561135b57828181518110611334576113346131dc565b6020026020010151826113479190613177565b9150806113538161325d565b915050611319565b506127108114611397576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516113aa906009906020860190612bf6565b5081516113be90600a906020850190612c80565b507fbd58a823390daa65d99f8a8b381a804509e21c2078db13de15849c3edaa9a95583836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611460576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061148357506000818152600460205260409020600201544211155b156114ba576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c5816001613177565b600281905560008181526004602052604090209081554260018201556114f160ff841662015180613302565b6115009062ffffff1642613177565b6002828101919091556003820185905560048201859055546040518581527f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906020015b60405180910390a250505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146115c2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b81146115fc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600b81101561163e5782828281811061161a5761161a6131dc565b6000848152601b6020908152604090912091029290920135909155506001016115ff565b507f7bcea34b82e222069291852af10dd0ce9909b890c8e851c52fd83de87883093d828260405161167092919061320b565b60405180910390a15050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146116ec576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281905560405181907f62fa44befc82da349c4e192c274524ec83957f8cad2344147faac6bbbd3aca9e90600090a250565b600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020600201545b92915050565b3360009081526020819052604090205460ff166117a2576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025480158015906117c557506000818152600460205260409020600201544211155b156117fc576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611807816001613177565b6002818155600082815260046020819052604091829020938455426001850155838301869055600384018790558301869055905490517f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906115449087815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146118dc576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611917576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090815b8451811015611a235760008281526005602052604081208651829088908590811061194c5761194c6131dc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008583815181106119a4576119a46131dc565b6020026020010151905081600001546000036119ec576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038201546119fb8282613321565b611a059087613177565b60039093019190915550925080611a1b8161325d565b91505061191f565b5060008181526004602052604081206007018054849290611a45908490613321565b909155505050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611ac0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611afb576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015611b4157828181518110611b1a57611b1a6131dc565b602002602001015182611b2d9190613177565b915080611b398161325d565b915050611aff565b506127108114611b7d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251611b9090600e906020860190612bf6565b508151611ba490600f906020850190612c80565b507f622860cbd141acea4430d275509fb57c7a9e332d2958c44b1821730b3778a1df83836040516110d9929190613295565b611c1e60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000908152600460208181526040928390208351610100810185528154815260018201549281019290925260028101549382019390935260038301546060820152908201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b611cd360405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060028054600090815260046020818152604092839020835161010081018552815481526001820154928101929092529384015492810192909252600383015460608301528201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611db2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a821115611ded576040517fcbbe0f4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152601b6020526040812054601c5490919061271090611e10908461318a565b611e1a91906131a1565b9050600084118015611e2b57508083105b15611e62576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526011602052604080822085905580516001808252818301909252908160200160208202803683370190505090508381600081518110611ea857611ea86131dc565b6020026020010181815250507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c81604051611ee39190612e86565b60405180910390a15050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611f62576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115611f9e576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068190556040518181527f858248b1156bac790ae06ed47561d905c1dfe56347b61de29930c266eb2a1683906020015b60405180910390a150565b8073ffffffffffffffffffffffffffffffffffffffff8116612028576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612098576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50601680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612150576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b623d090081111561218d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000918252600c602052604090912055565b6121fe604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b50600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff9590951684529381529183902083516101608101855281548152600182015493810193909352600281015493830193909352600383015460608301526004830154608083015282015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a9091015460ff16151561014082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612321576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805182511461235c576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b82518110156123a25782818151811061237b5761237b6131dc565b60200260200101518261238e9190613177565b91508061239a8161325d565b915050612360565b5061271081146123de576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516123f1906013906020860190612bf6565b508151612405906014906020850190612c80565b507fdabc66011f68fc990a5a3b502413fcfcd16c0788b1017255c8fa0745a2954cb283836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146124a7576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000928352600d60209081526040808520938552929052912055565b3360009081526020819052604090205460ff1661250c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601a54604080517f4fb85e18000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fb85e189160048082019260009290919082900301818387803b15801561257857600080fd5b505af115801561258c573d6000803e3d6000fd5b50506002546040519092507f83a7e21afbe67d7255378f6b4496052f066f91c138d8e5c40602e63fe85f3b429150600090a2565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281206003810154600290910154610ddc9190613177565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612674576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260076020526040908190208290555182907f8c5a04c32672ff89885a8de60723fe6ed9a293306cca3db58a1667056ebdab8990610f209084815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612729576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061274c57506000818152600460205260409020600201544211155b15612783576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612790826001613177565b600281905560008181526004602052604090208181554260018201819055919250906127bf906220f580613177565b6002820155600381018490556004810184905560405184815282907f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c90602001611544565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612874576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166128c1576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f7577407244e1eac6eec66ebaf9dc9ddb86aefcb50adde27d0b89b689f73b292590600090a250565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146129a0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156129dc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c8190556040518181527f585b544b2d9ebfba0b4030c5b12086c7e40b39d2bf7317868b70dad5a8fd06cc90602001611fcf565b8073ffffffffffffffffffffffffffffffffffffffff8116612a5f576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612acf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fba869e26b357347347ed9cc2f9f7c35185ded23c70d83aa3e3f1d339382c7bbd90600090a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612baf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c7057825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190612c16565b50612c7c929150612cbb565b5090565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c70578251825591602001919060010190612ca0565b5b80821115612c7c5760008155600101612cbc565b803573ffffffffffffffffffffffffffffffffffffffff81168114612cf457600080fd5b919050565b600060208284031215612d0b57600080fd5b610ddc82612cd0565b600060208284031215612d2657600080fd5b5035919050565b60008060408385031215612d4057600080fd5b50508035926020909101359150565b60008060208385031215612d6257600080fd5b823567ffffffffffffffff80821115612d7a57600080fd5b818501915085601f830112612d8e57600080fd5b813581811115612d9d57600080fd5b8660208260051b8501011115612db257600080fd5b60209290920196919550909350505050565b600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151612e438285018215159052565b505092915050565b600081518084526020808501945080840160005b83811015612e7b57815187529582019590820190600101612e5f565b509495945050505050565b602081526000610ddc6020830184612e4b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f0f57612f0f612e99565b604052919050565b600067ffffffffffffffff821115612f3157612f31612e99565b5060051b60200190565b600082601f830112612f4c57600080fd5b81356020612f61612f5c83612f17565b612ec8565b82815260059290921b84018101918181019086841115612f8057600080fd5b8286015b84811015612f9b5780358352918301918301612f84565b509695505050505050565b60008060408385031215612fb957600080fd5b823567ffffffffffffffff80821115612fd157600080fd5b818501915085601f830112612fe557600080fd5b81356020612ff5612f5c83612f17565b82815260059290921b8401810191818101908984111561301457600080fd5b948201945b838610156130395761302a86612cd0565b82529482019490820190613019565b9650508601359250508082111561304f57600080fd5b5061305c85828601612f3b565b9150509250929050565b6000806040838503121561307957600080fd5b82359150602083013560ff8116811461309157600080fd5b809150509250929050565b600080604083850312156130af57600080fd5b6130b883612cd0565b946020939093013593505050565b6000806000606084860312156130db57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561310557600080fd5b61310e83612cd0565b915061311c60208401612cd0565b90509250929050565b6000806040838503121561313857600080fd5b8235915061311c60208401612cd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561175357611753613148565b808202811582820484141761175357611753613148565b6000826131d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561324457600080fd5b8260051b80856040850137919091016040019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361328e5761328e613148565b5060010190565b604080825283519082018190526000906020906060840190828701845b828110156132e457815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016132b2565b505050838103828501526132f88186612e4b565b9695505050505050565b62ffffff818116838216028082169190828114612e4357612e43613148565b818103818111156117535761175361314856fea2646970667358221220677831a1627d9ce356899000399e02df7641dc343c974ff8517b9315d85e0a3364736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061038e5760003560e01c8063830f4cb1116101de578063b5e007901161010f578063df409589116100ad578063f55484ac1161007c578063f55484ac14610a53578063f557f1a914610a66578063fca7129f14610a79578063fe17bd2b14610a9c57600080fd5b8063df40958914610a1a578063e5ea3fdc14610594578063e856611814610a2d578063f008911114610a4057600080fd5b8063d18b3d90116100e9578063d18b3d9014610966578063d2b291d1146109ae578063d822bb87146109f4578063dbcbb9a314610a0757600080fd5b8063b5e0079014610906578063bc67f25f14610919578063c4882ed71461092157600080fd5b80639d0b7d5a1161017c578063ae178fda11610156578063ae178fda1461081c578063b150387914610861578063b234c9c4146108a6578063b3afe496146108b957600080fd5b80639d0b7d5a146107d25780639d6c100f146107e5578063a07693eb1461080957600080fd5b80638aee8127116101b85780638aee81271461075a578063947b43f41461076d57806395e2de331461078d5780639a56f4e41461063157600080fd5b8063830f4cb11461072b57806385e3f9971461073e5780638a91af171461074757600080fd5b80633e131a7a116102c35780635e75a6c3116102615780636e06c64d116102305780636e06c64d1461067c57806373ad27b01461068f578063753b8ece14610703578063820d0ad71461072357600080fd5b80635e75a6c3146105ca57806361ccdfba146105d257806366e017c3146106315780636bb70f6a1461065457600080fd5b80634dc0cd2b1161029d5780634dc0cd2b1461053f578063560cf6f514610581578063562b7153146105945780635c1624ab146105b757600080fd5b80633e131a7a146105065780634784f6bc146105195780634a477b141461052c57600080fd5b80632d4136a6116103305780633361e38b1161030a5780633361e38b146104b557806336a4a844146104c85780633940acb4146104db5780633d55b37b146104e357600080fd5b80632d4136a61461044a5780632e11ca8b1461047d5780633175cbe81461049257600080fd5b8063142950d61161036c578063142950d6146103fc578063275b629e14610404578063278a93e2146104175780632c5682eb1461042a57600080fd5b80630c4ed799146103935780630c7d72a7146103a85780630cc1687a146103db575b600080fd5b6103a66103a1366004612cf9565b610abc565b005b6103bb6103b6366004612cf9565b610bea565b604080519384526020840192909252908201526060015b60405180910390f35b6103ee6103e9366004612d14565b610db2565b6040519081526020016103d2565b6103a6610de3565b6103a6610412366004612d2d565b610e68565b6103a6610425366004612d4f565b610f2c565b61043d610438366004612cf9565b6110e6565b6040516103d29190612dc4565b61046d610458366004612d14565b6000908152601e602052604090205460ff1690565b60405190151581526020016103d2565b6104856111f9565b6040516103d29190612e86565b6103ee6104a0366004612d14565b60009081526004602052604090206005015490565b6103a66104c3366004612fa6565b61126a565b6103a66104d6366004613066565b6113f0565b601c546103ee565b6103ee6104f1366004612d14565b60009081526004602052604090206002015490565b6103a6610514366004612d4f565b611552565b6103a6610527366004612d14565b61167c565b6103ee61053a36600461309c565b61171f565b6103ee61054d36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b6103a661058f366004612d2d565b611759565b6103ee6105a2366004612d14565b60009081526004602052604090206003015490565b6103a66105c5366004612fa6565b61186c565b6002546103ee565b61061c6105e036600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080546002909101549091565b604080519283526020830191909152016103d2565b6103ee61063f366004612d14565b60009081526004602052604090206007015490565b60185460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103d2565b6103a661068a366004612fa6565b611a50565b6106a261069d366004612d14565b611bd6565b6040516103d29190600061010082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b6103ee610711366004612d14565b6000908152601b602052604090205490565b6106a2611c8b565b6103a6610739366004612d2d565b611d42565b6103ee61271081565b6103a6610755366004612d14565b611ef2565b6103a6610768366004612cf9565b611fda565b6103ee61077b366004612d14565b60009081526011602052604090205490565b6103ee61079b36600461309c565b600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff959095168452939052919020015490565b6103a66107e0366004612d2d565b6120e0565b6103ee6107f3366004612d14565b6000908152600460208190526040909120015490565b61043d61081736600461309c565b61219f565b6103ee61082a36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206006015490565b6103ee61086f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206007015490565b6103a66108b4366004612fa6565b6122b1565b61061c6108c736600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522060028101546003909101549091565b6103a66109143660046130c6565b612437565b6103a66124c3565b6103ee61092f36600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052206008015490565b61046d61097436600461309c565b600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292905220600a015460ff1690565b6103ee6109bc3660046130f2565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260106020908152604080832093909416825291909152205490565b6103ee610a02366004613125565b6125c0565b6103a6610a15366004612d2d565b612604565b6103a6610a28366004612d14565b6126b9565b6103a6610a3b366004612cf9565b612804565b6103a6610a4e366004612d14565b612930565b6103a6610a61366004612cf9565b612a11565b6103a6610a74366004612cf9565b612b3f565b6103ee610a87366004612d14565b60009081526004602052604090206006015490565b6103ee610aaa366004612d14565b60009081526012602052604090205490565b8073ffffffffffffffffffffffffffffffffffffffff8116610b0a576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610b7a576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fa95ef02bd478750565871921654c3eae0063151ae6f3e9824a5d52fd395d016e90600090a25050565b6000806000806000600201549050600080600501600083815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518061016001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820160009054906101000a900460ff1615151515815250509050600080600401600084815260200190815260200160002060405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815250509050600082606001518360400151610d649190613177565b835160e0840151909850909150610d7d8261271061318a565b610d8791906131a1565b9550612710868360600151610d9c919061318a565b610da691906131a1565b96989597505050505050565b6000818152601b6020526040812054601c5461271090610dd2908361318a565b610ddc91906131a1565b9392505050565b3360009081526020819052604090205460ff16610e2c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546000908152601e6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610ed8576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040908190206002018290555182907f4116cb3bf93ca69e12f15dddabaac80513467c175e1a2fbe7b4ac863ab701fc190610f209084815260200190565b60405180910390a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314610f9c576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b8114610fd6576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c5460005b600b8110156110a7576000818152601b602052604081205490612710611002858461318a565b61100c91906131a1565b905060008311801561103557508086868581811061102c5761102c6131dc565b90506020020135105b1561106c576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85858481811061107e5761107e6131dc565b600086815260116020908152604090912091029290920135909155505060019091019050610fdc565b507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c83836040516110d992919061320b565b60405180910390a1505050565b611145604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5060028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff90961684529481529184902084516101608101865281548152600182015493810193909352928301549382019390935260038201546060820152600482015460808201529181015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a015460ff16151561014082015290565b60408051600b808252610180820190925260609160009190602082016101608036833701905050905060005b600b811015611264576000818152601160205260409020548251839083908110611251576112516131dc565b6020908102919091010152600101611225565b50919050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146112da576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611315576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b825181101561135b57828181518110611334576113346131dc565b6020026020010151826113479190613177565b9150806113538161325d565b915050611319565b506127108114611397576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516113aa906009906020860190612bf6565b5081516113be90600a906020850190612c80565b507fbd58a823390daa65d99f8a8b381a804509e21c2078db13de15849c3edaa9a95583836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611460576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061148357506000818152600460205260409020600201544211155b156114ba576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c5816001613177565b600281905560008181526004602052604090209081554260018201556114f160ff841662015180613302565b6115009062ffffff1642613177565b6002828101919091556003820185905560048201859055546040518581527f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906020015b60405180910390a250505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146115c2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b81146115fc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600b81101561163e5782828281811061161a5761161a6131dc565b6000848152601b6020908152604090912091029290920135909155506001016115ff565b507f7bcea34b82e222069291852af10dd0ce9909b890c8e851c52fd83de87883093d828260405161167092919061320b565b60405180910390a15050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146116ec576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281905560405181907f62fa44befc82da349c4e192c274524ec83957f8cad2344147faac6bbbd3aca9e90600090a250565b600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020600201545b92915050565b3360009081526020819052604090205460ff166117a2576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025480158015906117c557506000818152600460205260409020600201544211155b156117fc576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611807816001613177565b6002818155600082815260046020819052604091829020938455426001850155838301869055600384018790558301869055905490517f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c906115449087815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146118dc576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611917576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254600090815b8451811015611a235760008281526005602052604081208651829088908590811061194c5761194c6131dc565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008583815181106119a4576119a46131dc565b6020026020010151905081600001546000036119ec576040517fd9adec6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038201546119fb8282613321565b611a059087613177565b60039093019190915550925080611a1b8161325d565b91505061191f565b5060008181526004602052604081206007018054849290611a45908490613321565b909155505050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611ac0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114611afb576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015611b4157828181518110611b1a57611b1a6131dc565b602002602001015182611b2d9190613177565b915080611b398161325d565b915050611aff565b506127108114611b7d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251611b9090600e906020860190612bf6565b508151611ba490600f906020850190612c80565b507f622860cbd141acea4430d275509fb57c7a9e332d2958c44b1821730b3778a1df83836040516110d9929190613295565b611c1e60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000908152600460208181526040928390208351610100810185528154815260018201549281019290925260028101549382019390935260038301546060820152908201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b611cd360405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5060028054600090815260046020818152604092839020835161010081018552815481526001820154928101929092529384015492810192909252600383015460608301528201546080820152600582015460a0820152600682015460c082015260079091015460e082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611db2576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a821115611ded576040517fcbbe0f4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152601b6020526040812054601c5490919061271090611e10908461318a565b611e1a91906131a1565b9050600084118015611e2b57508083105b15611e62576040517f70ed532700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526011602052604080822085905580516001808252818301909252908160200160208202803683370190505090508381600081518110611ea857611ea86131dc565b6020026020010181815250507fa89ede23c11cc8eeaf974b7001331c6070c66dd433f5c37bc2619f881841705c81604051611ee39190612e86565b60405180910390a15050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314611f62576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612710811115611f9e576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068190556040518181527f858248b1156bac790ae06ed47561d905c1dfe56347b61de29930c266eb2a1683906020015b60405180910390a150565b8073ffffffffffffffffffffffffffffffffffffffff8116612028576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612098576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50601680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612150576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b623d090081111561218d576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000918252600c602052604090912055565b6121fe604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b50600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff9590951684529381529183902083516101608101855281548152600182015493810193909352600281015493830193909352600383015460608301526004830154608083015282015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a9091015460ff16151561014082015290565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612321576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805182511461235c576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b82518110156123a25782818151811061237b5761237b6131dc565b60200260200101518261238e9190613177565b91508061239a8161325d565b915050612360565b5061271081146123de576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516123f1906013906020860190612bf6565b508151612405906014906020850190612c80565b507fdabc66011f68fc990a5a3b502413fcfcd16c0788b1017255c8fa0745a2954cb283836040516110d9929190613295565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146124a7576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000928352600d60209081526040808520938552929052912055565b3360009081526020819052604090205460ff1661250c576040517ff39650ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601a54604080517f4fb85e18000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fb85e189160048082019260009290919082900301818387803b15801561257857600080fd5b505af115801561258c573d6000803e3d6000fd5b50506002546040519092507f83a7e21afbe67d7255378f6b4496052f066f91c138d8e5c40602e63fe85f3b429150600090a2565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281206003810154600290910154610ddc9190613177565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612674576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260076020526040908190208290555182907f8c5a04c32672ff89885a8de60723fe6ed9a293306cca3db58a1667056ebdab8990610f209084815260200190565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612729576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254801580159061274c57506000818152600460205260409020600201544211155b15612783576040517f42be98a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612790826001613177565b600281905560008181526004602052604090208181554260018201819055919250906127bf906220f580613177565b6002820155600381018490556004810184905560405184815282907f8d160eff266df162107c57259a1f1e71787bd4ab800800826bd189d6f2f3e83c90602001611544565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612874576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166128c1576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f7577407244e1eac6eec66ebaf9dc9ddb86aefcb50adde27d0b89b689f73b292590600090a250565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146129a0576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127108111156129dc576040517f3bbe051b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c8190556040518181527f585b544b2d9ebfba0b4030c5b12086c7e40b39d2bf7317868b70dad5a8fd06cc90602001611fcf565b8073ffffffffffffffffffffffffffffffffffffffff8116612a5f576040517f04e85d6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612acf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fba869e26b357347347ed9cc2f9f7c35185ded23c70d83aa3e3f1d339382c7bbd90600090a25050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff163314612baf576040517f63efb71900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c7057825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190612c16565b50612c7c929150612cbb565b5090565b828054828255906000526020600020908101928215612c70579160200282015b82811115612c70578251825591602001919060010190612ca0565b5b80821115612c7c5760008155600101612cbc565b803573ffffffffffffffffffffffffffffffffffffffff81168114612cf457600080fd5b919050565b600060208284031215612d0b57600080fd5b610ddc82612cd0565b600060208284031215612d2657600080fd5b5035919050565b60008060408385031215612d4057600080fd5b50508035926020909101359150565b60008060208385031215612d6257600080fd5b823567ffffffffffffffff80821115612d7a57600080fd5b818501915085601f830112612d8e57600080fd5b813581811115612d9d57600080fd5b8660208260051b8501011115612db257600080fd5b60209290920196919550909350505050565b600061016082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151612e438285018215159052565b505092915050565b600081518084526020808501945080840160005b83811015612e7b57815187529582019590820190600101612e5f565b509495945050505050565b602081526000610ddc6020830184612e4b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f0f57612f0f612e99565b604052919050565b600067ffffffffffffffff821115612f3157612f31612e99565b5060051b60200190565b600082601f830112612f4c57600080fd5b81356020612f61612f5c83612f17565b612ec8565b82815260059290921b84018101918181019086841115612f8057600080fd5b8286015b84811015612f9b5780358352918301918301612f84565b509695505050505050565b60008060408385031215612fb957600080fd5b823567ffffffffffffffff80821115612fd157600080fd5b818501915085601f830112612fe557600080fd5b81356020612ff5612f5c83612f17565b82815260059290921b8401810191818101908984111561301457600080fd5b948201945b838610156130395761302a86612cd0565b82529482019490820190613019565b9650508601359250508082111561304f57600080fd5b5061305c85828601612f3b565b9150509250929050565b6000806040838503121561307957600080fd5b82359150602083013560ff8116811461309157600080fd5b809150509250929050565b600080604083850312156130af57600080fd5b6130b883612cd0565b946020939093013593505050565b6000806000606084860312156130db57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561310557600080fd5b61310e83612cd0565b915061311c60208401612cd0565b90509250929050565b6000806040838503121561313857600080fd5b8235915061311c60208401612cd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561175357611753613148565b808202811582820484141761175357611753613148565b6000826131d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561324457600080fd5b8260051b80856040850137919091016040019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361328e5761328e613148565b5060010190565b604080825283519082018190526000906020906060840190828701845b828110156132e457815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016132b2565b505050838103828501526132f88186612e4b565b9695505050505050565b62ffffff818116838216028082169190828114612e4357612e43613148565b818103818111156117535761175361314856fea2646970667358221220677831a1627d9ce356899000399e02df7641dc343c974ff8517b9315d85e0a3364736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -1656,7 +1656,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0x0F24f5B58B5c9a06305BE1e3a2Ac3CbE46A5eDc4" + "address": "0x0168CbCEBA9A0ff9B5b139a362907FC397aD5077" }, "hardhat": { "artifact": { diff --git a/deployments/FeeCollectorFacet.json b/deployments/FeeCollectorFacet.json index 515ff00..3e2a1d2 100644 --- a/deployments/FeeCollectorFacet.json +++ b/deployments/FeeCollectorFacet.json @@ -30,8 +30,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506106f5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063238e2b2b1461003b578063b2e07cf414610045575b600080fd5b61004361004d565b005b6100436102fc565b6100586000336105a5565b6000806009018054806020026020016040519081016040528092919081815260200182805480156100bf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610094575b505083516017549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f657600080601001600086848151811061010a5761010a610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008060100160008785815181106101a6576101a6610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061025757610257610608565b6020026020010151836040518363ffffffff1660e01b815260040161029e92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156102bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e19190610637565b505080806102ee90610660565b9150506100e8565b50505050565b6103076000336105a5565b600080600e0180548060200260200160405190810160405280929190818152602001828054801561036e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610343575b505083516019549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f65760008060100160008684815181106103b9576103b9610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600080601001600087858151811061045557610455610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061050657610506610608565b6020026020010151836040518363ffffffff1660e01b815260040161054d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561056c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105909190610637565b5050808061059d90610660565b915050610397565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff16610604576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561064957600080fd5b8151801515811461065957600080fd5b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea2646970667358221220774cf0d06b84ab9ac34a7a54f8fbea51f4647defb8c7192b22d230618d4075f764736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063238e2b2b1461003b578063b2e07cf414610045575b600080fd5b61004361004d565b005b6100436102fc565b6100586000336105a5565b6000806009018054806020026020016040519081016040528092919081815260200182805480156100bf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610094575b505083516017549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f657600080601001600086848151811061010a5761010a610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008060100160008785815181106101a6576101a6610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061025757610257610608565b6020026020010151836040518363ffffffff1660e01b815260040161029e92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156102bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e19190610637565b505080806102ee90610660565b9150506100e8565b50505050565b6103076000336105a5565b600080600e0180548060200260200160405190810160405280929190818152602001828054801561036e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610343575b505083516019549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f65760008060100160008684815181106103b9576103b9610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600080601001600087858151811061045557610455610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061050657610506610608565b6020026020010151836040518363ffffffff1660e01b815260040161054d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561056c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105909190610637565b5050808061059d90610660565b915050610397565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff16610604576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561064957600080fd5b8151801515811461065957600080fd5b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea2646970667358221220774cf0d06b84ab9ac34a7a54f8fbea51f4647defb8c7192b22d230618d4075f764736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b506106f5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063238e2b2b1461003b578063b2e07cf414610045575b600080fd5b61004361004d565b005b6100436102fc565b6100586000336105a5565b6000806009018054806020026020016040519081016040528092919081815260200182805480156100bf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610094575b505083516015549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f657600080601001600086848151811061010a5761010a610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008060100160008785815181106101a6576101a6610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061025757610257610608565b6020026020010151836040518363ffffffff1660e01b815260040161029e92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156102bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e19190610637565b505080806102ee90610660565b9150506100e8565b50505050565b6103076000336105a5565b600080600e0180548060200260200160405190810160405280929190818152602001828054801561036e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610343575b505083516017549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f65760008060100160008684815181106103b9576103b9610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600080601001600087858151811061045557610455610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061050657610506610608565b6020026020010151836040518363ffffffff1660e01b815260040161054d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561056c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105909190610637565b5050808061059d90610660565b915050610397565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff16610604576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561064957600080fd5b8151801515811461065957600080fd5b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea264697066735822122088191d6b5881117cb4691843d642ef56b771234fa521a416185842af6916da2a64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063238e2b2b1461003b578063b2e07cf414610045575b600080fd5b61004361004d565b005b6100436102fc565b6100586000336105a5565b6000806009018054806020026020016040519081016040528092919081815260200182805480156100bf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610094575b505083516015549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f657600080601001600086848151811061010a5761010a610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008060100160008785815181106101a6576101a6610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061025757610257610608565b6020026020010151836040518363ffffffff1660e01b815260040161029e92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156102bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e19190610637565b505080806102ee90610660565b9150506100e8565b50505050565b6103076000336105a5565b600080600e0180548060200260200160405190810160405280929190818152602001828054801561036e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610343575b505083516017549495509373ffffffffffffffffffffffffffffffffffffffff16925060009150505b828110156102f65760008060100160008684815181106103b9576103b9610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600080601001600087858151811061045557610455610608565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86848151811061050657610506610608565b6020026020010151836040518363ffffffff1660e01b815260040161054d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561056c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105909190610637565b5050808061059d90610660565b915050610397565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020839052604090205460ff16610604576040517f2c52e07400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561064957600080fd5b8151801515811461065957600080fd5b9392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea264697066735822122088191d6b5881117cb4691843d642ef56b771234fa521a416185842af6916da2a64736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -40,7 +40,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0x115A70C959aabCD71ac2086940985Aeb1e1a6BbF" + "address": "0xB5400eea2aCAAAAB8C7Ba4b0e20df92Eb645bACe" }, "hardhat": { "artifact": { diff --git a/deployments/FujiMigrationInit.json b/deployments/FujiMigrationInit.json new file mode 100644 index 0000000..13c676e --- /dev/null +++ b/deployments/FujiMigrationInit.json @@ -0,0 +1,66 @@ +{ + "fuji": { + "artifact": { + "_format": "hh-sol-artifact-1", + "contractName": "FujiMigrationInit", + "sourceName": "src/upgradeInitializers/FujiMigrationInit.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "address[]", + "name": "unlockFeeReceivers", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "unlockFeeReceiversShares", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "boostFeeReceivers", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "boostFeeReceiversShares", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "miningPassFeeReceivers", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "miningPassFeeReceiversShares", + "type": "uint256[]" + } + ], + "internalType": "struct FujiMigrationInit.Args", + "name": "_args", + "type": "tuple" + } + ], + "name": "init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5061123e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e45b49bf14610030575b600080fd5b61004361003e366004611059565b610045565b005b601954601a54601b54601c54601d54601e5473ffffffffffffffffffffffffffffffffffffffff86166100ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f46756a694d6967726174696f6e3a206465706f736974546f6b656e206973207a60448201527f65726f000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661017c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f46756a694d6967726174696f6e3a20666565546f6b656e206973207a65726f0060448201526064016100f6565b856015558460165583601755826018558160195580601a556000601b556000601d556000601e556101ae600960009055565b6000600a5560005b875151811015610285578751805160099190839081106101d8576101d861117a565b602090810291909101810151825460018101845560009384529282902090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558801518051600a9190839081106102545761025461117a565b602090810291909101810151825460018101845560009384529190922001558061027d816111a9565b9150506101b6565b506000600e556000600f5560005b876040015151811015610367576000600e01886040015182815181106102bb576102bb61117a565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905560608801518051600f9190839081106103365761033661117a565b602090810291909101810151825460018101845560009384529190922001558061035f816111a9565b915050610293565b506000601355600060145560005b8760800151518110156104495760006013018860800151828151811061039d5761039d61117a565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905560a0880151805160149190839081106104185761041861117a565b6020908102919091018101518254600181018455600093845291909220015580610441816111a9565b915050610375565b505060007f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b78190556207a1207f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b552819055620f42407f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c628819055621e84807f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c87ff819055623d09007f251164fe1d8864fe5e86082eae9c288bc2b58695a4d28538dfe86e9e4f175585819055627a12007fc550213cee30afd5e67ccba7be3d381bbc169034ae08eb3ec9168caca9fe55e781905562e4e1c07ffb9ce45064c7e7d9bf9deb4750ba7c94ab3d6e7418c5d76bf69966d39a9d42f68190556301c9c3807f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c8190556302faf0807f5fae251ae169e8e40026ce4ce85a026bc3adcccdc8459be361195e4cd924077f81905563047868c07ff53d7d0eac8d4a28c5e36c803b226f3ef35ce8ff0302108a97c0d862a51c6fa38190556305f5e1007f28819bbfa35988de500160af3ee4d060ea4da2d0fc4b680f9032b1bba4c6604b8190557f584f46c60af19681376031579adb04a2416e54ee5505351c2a8435e3766026ea8b90557f9fafca4c9c0d5c2cbf85f49fd8ab8212430ce78c2a0cb75b51e0f9c4f9ace003999099557f1dd2f4b94a51cfb409e6e317a497f7cfd9013960a1c723f830c49c05a25f08a5979097557f804a3d0621e73505f5f0c57c922f3e57d6b48e175551184eb12f80d7b4a9c7838690557fa952f8c0f40734b22d2328e0f7ff57eeffee78885b9cf2147ff941cc37e1c86e8590557fb48400cb19cf39e58355a7c9fd856f9b5b7298c53856a6766c6b39755ccafa79939093557ff5ddd0b8f160eab91dc4f82b50a485a96cf6ab0bfb38460d73171763afb6d5cf919091557f6fa0adbc19babfec7e85ff6417830cdb284ababb3de438515569d7f3d9b34931557f90dc0d05fc750d51b3e484087edb4e9beb1a58b38bc8386c0e048690482d89ed557fd39da6ede46e21e407297cf3ef5dc00c802e94eec4797dd3572940f5a025af20929092557f982dbf30ed444b538a358f088254f617250b1fe62040b333c0dc2be6831044eb9290925569010f0cf064dd592000007f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b5569021e19e0c9bab24000007f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a35569054b40b1f852bda000007f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b255690cb49b44ba602d8000007f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a55691fc3842bd1f071c000007fb4fcd034df3d20faa1c133b66d862ce92732727d40916b48ffb4020cb00fe05355694a1d89bb94865ec000007f45429b9195d4ec5c0cf6c69e9c21a4ca0ea773b702c2de5735f85d2631f267465569a968163f0a57b40000007f1223f9031f9dca49a7844c397098ce9a4e80513444d0a8bb59820dff564808e4556a017d2a320dd745550000007f724fd36bd271795fe7866d4cc83b61084ef704502b00c2e0b28047123b3c1acc556a03b8e97d229a2d548000007f855d8d6df66418fea944661cfca175a2245b01f09908f1f662c4fa2b3cbf9299556a09ed194db19b238c0000007fb9bfc87ab6d50430c17fad3d76aa4e9fce5cb9f8a8035e5ad64505fa1e31bdb9557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f4d862627e71449ad0902e42fb445c6fefb557d066705175da90fdc325bd76e4e556109c4601c9081556101f47f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df556102267fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b8285561028a7fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d556103207f3be6fd20d5acfde5b873b48692cd31f4d3c7e8ee8a813af4696af8859e5ca6c6556103e87fb805995a7ec585a251200611a61d179cfd7fb105e1ab17dc415a7336783786f7556105dc7fbcdda56b5d08466ec462cbbe0adfa57cb0a15fcc8940ef68f702f21b787bc935557f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e88490557fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c92909255622dc6c07f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720557fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd75560147fab4c5e6d94bd05a4bc56bf86e345985172e352a45f60387bc2e75a915e3a19c25560197fb160a7406e28258be08ad805a9afb846e1966a5cc82707dbcb44ed395fc389ee5560217fb9d46844e5f44943022fede37b711babdd9de39af3cab9490ab8d63ad17d130255602d7f8766d65f062c0ef4ef6d0904498fe293d275999dda7c3b2e86c36355a8ea1b435560417f6bd412ebfcfbe461c4e41627a59fac53c3ee2838a97c6c8dc311b4befcba70b05560647f365c87aa32fc67fa1b489401a5319dac0c7fc06537637ee675387949979ee4a45560167fc60e777e3969e7af65eb621b710e8488643506f977562c73dba103cb35b15a84557f9786f677b3dff6c36ad0d47ef13860fd51b928c112d9702e0dea2fe690bf6ec181905560257f332275a058505107a86f8909487584ee26365a1ad866fdfd7d0ca217736986ed5560337fa4b2ae645069b0fe342e4873e7f3a2b47b2e1410299f64d1a1b2c9313380bac855604a7f6868be3980be7fd972596ca506cada9b78aca12a9006443b1916ce784f8ef8a85560737f258b311fdbc5b9406bebc411e3db4e8c24ddc70cdf726f12e2420e8e40199cd05560187f162e617daa896dc1c65340fbda9b95c9bb6b9cfad93eb872e620003a70b983e655601e7f54bf5bc4b2226bde4cc3e74a9ec72288325c7fa9a62e34b6f2e529209d79e0fb5560287f43a1014b6961384d1120382c968e1e5a446fd730c5b0be82a93447b93d8c57805560377fdf907ee502102e7c62cec3210e3216baba694172f98d9878eb35ef1bec0d16b05560517f84e722789c62b0dc97803f3d1dab51fd1ef82b0c463751f13b5ecc891f27158a55607d7fccc637506da1a634040c39851816cdc15ec8706fd5bb5cf030e32f3b5707e00d557f0dd4cabb2db0650ac03dd3096f485c7efdbe2df7a48b0f8f9417f21da11259505560237fca689a1f7db89b8710c79c63830a1317054bd8ec2ee851f1b33a21b2a41ae4f955602f7fb963a2cc96831b7d1bee11154ddec13c7b5e8ac05c70661c4538de70ac16a32a5560407f453e2823e0c78b590eaeddf7807d57c263c48a0a3d13054dd8d170a8a0b5469055605e7f11a6df99eada7208f7aa93e8b6930faa7431d65501c040d3866253a695b946f0556003905250507fa5049387d9cb649c59f4bda666105ba636c2a103d8e2b232ba4d125737cd2149602052505060917fbbc468684b2defec2483a9f49b2b0f348612729be8edbbf8dd3b2247da7f4069555050600a600b55565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715610ef757610ef7610ea5565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610f4457610f44610ea5565b604052919050565b600067ffffffffffffffff821115610f6657610f66610ea5565b5060051b60200190565b600082601f830112610f8157600080fd5b81356020610f96610f9183610f4c565b610efd565b82815260059290921b84018101918181019086841115610fb557600080fd5b8286015b84811015610ff357803573ffffffffffffffffffffffffffffffffffffffff81168114610fe65760008081fd5b8352918301918301610fb9565b509695505050505050565b600082601f83011261100f57600080fd5b8135602061101f610f9183610f4c565b82815260059290921b8401810191818101908684111561103e57600080fd5b8286015b84811015610ff35780358352918301918301611042565b60006020828403121561106b57600080fd5b813567ffffffffffffffff8082111561108357600080fd5b9083019060c0828603121561109757600080fd5b61109f610ed4565b8235828111156110ae57600080fd5b6110ba87828601610f70565b8252506020830135828111156110cf57600080fd5b6110db87828601610ffe565b6020830152506040830135828111156110f357600080fd5b6110ff87828601610f70565b60408301525060608301358281111561111757600080fd5b61112387828601610ffe565b60608301525060808301358281111561113b57600080fd5b61114787828601610f70565b60808301525060a08301358281111561115f57600080fd5b61116b87828601610ffe565b60a08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611201577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea26469706673582212207c493404e2cdc6925dfa6f36de27d81d4380ca4bc48b6b426abb62a256a6b77564736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e45b49bf14610030575b600080fd5b61004361003e366004611059565b610045565b005b601954601a54601b54601c54601d54601e5473ffffffffffffffffffffffffffffffffffffffff86166100ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f46756a694d6967726174696f6e3a206465706f736974546f6b656e206973207a60448201527f65726f000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661017c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f46756a694d6967726174696f6e3a20666565546f6b656e206973207a65726f0060448201526064016100f6565b856015558460165583601755826018558160195580601a556000601b556000601d556000601e556101ae600960009055565b6000600a5560005b875151811015610285578751805160099190839081106101d8576101d861117a565b602090810291909101810151825460018101845560009384529282902090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558801518051600a9190839081106102545761025461117a565b602090810291909101810151825460018101845560009384529190922001558061027d816111a9565b9150506101b6565b506000600e556000600f5560005b876040015151811015610367576000600e01886040015182815181106102bb576102bb61117a565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905560608801518051600f9190839081106103365761033661117a565b602090810291909101810151825460018101845560009384529190922001558061035f816111a9565b915050610293565b506000601355600060145560005b8760800151518110156104495760006013018860800151828151811061039d5761039d61117a565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905560a0880151805160149190839081106104185761041861117a565b6020908102919091018101518254600181018455600093845291909220015580610441816111a9565b915050610375565b505060007f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b78190556207a1207f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b552819055620f42407f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c628819055621e84807f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c87ff819055623d09007f251164fe1d8864fe5e86082eae9c288bc2b58695a4d28538dfe86e9e4f175585819055627a12007fc550213cee30afd5e67ccba7be3d381bbc169034ae08eb3ec9168caca9fe55e781905562e4e1c07ffb9ce45064c7e7d9bf9deb4750ba7c94ab3d6e7418c5d76bf69966d39a9d42f68190556301c9c3807f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c8190556302faf0807f5fae251ae169e8e40026ce4ce85a026bc3adcccdc8459be361195e4cd924077f81905563047868c07ff53d7d0eac8d4a28c5e36c803b226f3ef35ce8ff0302108a97c0d862a51c6fa38190556305f5e1007f28819bbfa35988de500160af3ee4d060ea4da2d0fc4b680f9032b1bba4c6604b8190557f584f46c60af19681376031579adb04a2416e54ee5505351c2a8435e3766026ea8b90557f9fafca4c9c0d5c2cbf85f49fd8ab8212430ce78c2a0cb75b51e0f9c4f9ace003999099557f1dd2f4b94a51cfb409e6e317a497f7cfd9013960a1c723f830c49c05a25f08a5979097557f804a3d0621e73505f5f0c57c922f3e57d6b48e175551184eb12f80d7b4a9c7838690557fa952f8c0f40734b22d2328e0f7ff57eeffee78885b9cf2147ff941cc37e1c86e8590557fb48400cb19cf39e58355a7c9fd856f9b5b7298c53856a6766c6b39755ccafa79939093557ff5ddd0b8f160eab91dc4f82b50a485a96cf6ab0bfb38460d73171763afb6d5cf919091557f6fa0adbc19babfec7e85ff6417830cdb284ababb3de438515569d7f3d9b34931557f90dc0d05fc750d51b3e484087edb4e9beb1a58b38bc8386c0e048690482d89ed557fd39da6ede46e21e407297cf3ef5dc00c802e94eec4797dd3572940f5a025af20929092557f982dbf30ed444b538a358f088254f617250b1fe62040b333c0dc2be6831044eb9290925569010f0cf064dd592000007f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b5569021e19e0c9bab24000007f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a35569054b40b1f852bda000007f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b255690cb49b44ba602d8000007f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a55691fc3842bd1f071c000007fb4fcd034df3d20faa1c133b66d862ce92732727d40916b48ffb4020cb00fe05355694a1d89bb94865ec000007f45429b9195d4ec5c0cf6c69e9c21a4ca0ea773b702c2de5735f85d2631f267465569a968163f0a57b40000007f1223f9031f9dca49a7844c397098ce9a4e80513444d0a8bb59820dff564808e4556a017d2a320dd745550000007f724fd36bd271795fe7866d4cc83b61084ef704502b00c2e0b28047123b3c1acc556a03b8e97d229a2d548000007f855d8d6df66418fea944661cfca175a2245b01f09908f1f662c4fa2b3cbf9299556a09ed194db19b238c0000007fb9bfc87ab6d50430c17fad3d76aa4e9fce5cb9f8a8035e5ad64505fa1e31bdb9557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f4d862627e71449ad0902e42fb445c6fefb557d066705175da90fdc325bd76e4e556109c4601c9081556101f47f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df556102267fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b8285561028a7fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d556103207f3be6fd20d5acfde5b873b48692cd31f4d3c7e8ee8a813af4696af8859e5ca6c6556103e87fb805995a7ec585a251200611a61d179cfd7fb105e1ab17dc415a7336783786f7556105dc7fbcdda56b5d08466ec462cbbe0adfa57cb0a15fcc8940ef68f702f21b787bc935557f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e88490557fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c92909255622dc6c07f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd720557fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd75560147fab4c5e6d94bd05a4bc56bf86e345985172e352a45f60387bc2e75a915e3a19c25560197fb160a7406e28258be08ad805a9afb846e1966a5cc82707dbcb44ed395fc389ee5560217fb9d46844e5f44943022fede37b711babdd9de39af3cab9490ab8d63ad17d130255602d7f8766d65f062c0ef4ef6d0904498fe293d275999dda7c3b2e86c36355a8ea1b435560417f6bd412ebfcfbe461c4e41627a59fac53c3ee2838a97c6c8dc311b4befcba70b05560647f365c87aa32fc67fa1b489401a5319dac0c7fc06537637ee675387949979ee4a45560167fc60e777e3969e7af65eb621b710e8488643506f977562c73dba103cb35b15a84557f9786f677b3dff6c36ad0d47ef13860fd51b928c112d9702e0dea2fe690bf6ec181905560257f332275a058505107a86f8909487584ee26365a1ad866fdfd7d0ca217736986ed5560337fa4b2ae645069b0fe342e4873e7f3a2b47b2e1410299f64d1a1b2c9313380bac855604a7f6868be3980be7fd972596ca506cada9b78aca12a9006443b1916ce784f8ef8a85560737f258b311fdbc5b9406bebc411e3db4e8c24ddc70cdf726f12e2420e8e40199cd05560187f162e617daa896dc1c65340fbda9b95c9bb6b9cfad93eb872e620003a70b983e655601e7f54bf5bc4b2226bde4cc3e74a9ec72288325c7fa9a62e34b6f2e529209d79e0fb5560287f43a1014b6961384d1120382c968e1e5a446fd730c5b0be82a93447b93d8c57805560377fdf907ee502102e7c62cec3210e3216baba694172f98d9878eb35ef1bec0d16b05560517f84e722789c62b0dc97803f3d1dab51fd1ef82b0c463751f13b5ecc891f27158a55607d7fccc637506da1a634040c39851816cdc15ec8706fd5bb5cf030e32f3b5707e00d557f0dd4cabb2db0650ac03dd3096f485c7efdbe2df7a48b0f8f9417f21da11259505560237fca689a1f7db89b8710c79c63830a1317054bd8ec2ee851f1b33a21b2a41ae4f955602f7fb963a2cc96831b7d1bee11154ddec13c7b5e8ac05c70661c4538de70ac16a32a5560407f453e2823e0c78b590eaeddf7807d57c263c48a0a3d13054dd8d170a8a0b5469055605e7f11a6df99eada7208f7aa93e8b6930faa7431d65501c040d3866253a695b946f0556003905250507fa5049387d9cb649c59f4bda666105ba636c2a103d8e2b232ba4d125737cd2149602052505060917fbbc468684b2defec2483a9f49b2b0f348612729be8edbbf8dd3b2247da7f4069555050600a600b55565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715610ef757610ef7610ea5565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610f4457610f44610ea5565b604052919050565b600067ffffffffffffffff821115610f6657610f66610ea5565b5060051b60200190565b600082601f830112610f8157600080fd5b81356020610f96610f9183610f4c565b610efd565b82815260059290921b84018101918181019086841115610fb557600080fd5b8286015b84811015610ff357803573ffffffffffffffffffffffffffffffffffffffff81168114610fe65760008081fd5b8352918301918301610fb9565b509695505050505050565b600082601f83011261100f57600080fd5b8135602061101f610f9183610f4c565b82815260059290921b8401810191818101908684111561103e57600080fd5b8286015b84811015610ff35780358352918301918301611042565b60006020828403121561106b57600080fd5b813567ffffffffffffffff8082111561108357600080fd5b9083019060c0828603121561109757600080fd5b61109f610ed4565b8235828111156110ae57600080fd5b6110ba87828601610f70565b8252506020830135828111156110cf57600080fd5b6110db87828601610ffe565b6020830152506040830135828111156110f357600080fd5b6110ff87828601610f70565b60408301525060608301358281111561111757600080fd5b61112387828601610ffe565b60608301525060808301358281111561113b57600080fd5b61114787828601610f70565b60808301525060a08301358281111561115f57600080fd5b61116b87828601610ffe565b60a08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611201577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea26469706673582212207c493404e2cdc6925dfa6f36de27d81d4380ca4bc48b6b426abb62a256a6b77564736f6c63430008120033", + "linkReferences": {}, + "deployedLinkReferences": {} + }, + "options": { + "args": [], + "log": true, + "skipIfAlreadyDeployed": false + }, + "address": "0x94d336eDC9D2ee62071398ec1979fa91B3fE451A" + } +} \ No newline at end of file diff --git a/deployments/MiningPassFacet.json b/deployments/MiningPassFacet.json index 874f904..36068e4 100644 --- a/deployments/MiningPassFacet.json +++ b/deployments/MiningPassFacet.json @@ -118,8 +118,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061091b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063675f4b7614610046578063efef39a11461006c578063fe315a1314610081575b600080fd5b61005961005436600461076f565b610166565b6040519081526020015b60405180910390f35b61007f61007a366004610799565b6102c5565b005b61015161008f3660046107b2565b60028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616845294815284832085516101608101875281548152600182015481840152948101548587015260038101546060860152600481015460808601529182015460a0850152600682015460c0850152600782015460e0850152600882015461010085015260098201546101208501819052600a9092015460ff16151561014090940193909352808252601290925291909120549091565b60408051928352602083019190915201610063565b6000818152601160209081526040808320546002548085526005845282852073ffffffffffffffffffffffffffffffffffffffff88168652845282852081865260049094529184209092908515806101c2575081600901548611155b806101cb575083155b15610202576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600982015460009081526011602052604090205461022090856107fc565b94504281600201541161025f576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6212750081600101544261027391906107fc565b1061028a5761028360028661080f565b94506102bb565b62093a8081600101544261029e91906107fc565b106102bb576102ae60048661080f565b6102b890866107fc565b94505b5050505092915050565b600081815260116020908152604080832054601954600254808652600585528386203387528552838620818752600490955292909420909373ffffffffffffffffffffffffffffffffffffffff169290851580610326575081600901548611155b8061032f575084155b15610366576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428160020154116103a3576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103af3388610166565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152909150819073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610442919061084a565b101561047a576040517f0289a60100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104838161056a565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8616906323b872dd906064016020604051808303816000875af11580156104fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105209190610863565b50600983018790556040518181528790339086907fea32e0bbe6b44ae07c7113eff6123c3921029d514dc3383bfd3868da45f4f4049060200160405180910390a450505050505050565b6000806013018054806020026020016040519081016040528092919081815260200182805480156105d157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116105a6575b5050505050905060008060140180548060200260200160405190810160405280929190818152602001828054801561062857602002820191906000526020600020905b815481526020019060010190808311610614575b505050505090506000825190508151811461066f576040517fac9b143300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561071d57600061069f868584815181106106925761069261088c565b6020026020010151610724565b905080600060100160008785815181106106bb576106bb61088c565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff9081168352828201939093526040918201600090812060195490941681529290528120805490919061070f9084906108bb565b909155505050600101610672565b5050505050565b600061271061073383856108ce565b61073d919061080f565b90505b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461076a57600080fd5b919050565b6000806040838503121561078257600080fd5b61078b83610746565b946020939093013593505050565b6000602082840312156107ab57600080fd5b5035919050565b6000602082840312156107c457600080fd5b61073d82610746565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610740576107406107cd565b600082610845577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561085c57600080fd5b5051919050565b60006020828403121561087557600080fd5b8151801515811461088557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115610740576107406107cd565b8082028115828204841417610740576107406107cd56fea264697066735822122040e9f993341ab255cf589a16f2bfcfc747fbe9f7437ee081ec4668700b5f570264736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063675f4b7614610046578063efef39a11461006c578063fe315a1314610081575b600080fd5b61005961005436600461076f565b610166565b6040519081526020015b60405180910390f35b61007f61007a366004610799565b6102c5565b005b61015161008f3660046107b2565b60028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616845294815284832085516101608101875281548152600182015481840152948101548587015260038101546060860152600481015460808601529182015460a0850152600682015460c0850152600782015460e0850152600882015461010085015260098201546101208501819052600a9092015460ff16151561014090940193909352808252601290925291909120549091565b60408051928352602083019190915201610063565b6000818152601160209081526040808320546002548085526005845282852073ffffffffffffffffffffffffffffffffffffffff88168652845282852081865260049094529184209092908515806101c2575081600901548611155b806101cb575083155b15610202576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600982015460009081526011602052604090205461022090856107fc565b94504281600201541161025f576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6212750081600101544261027391906107fc565b1061028a5761028360028661080f565b94506102bb565b62093a8081600101544261029e91906107fc565b106102bb576102ae60048661080f565b6102b890866107fc565b94505b5050505092915050565b600081815260116020908152604080832054601954600254808652600585528386203387528552838620818752600490955292909420909373ffffffffffffffffffffffffffffffffffffffff169290851580610326575081600901548611155b8061032f575084155b15610366576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428160020154116103a3576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103af3388610166565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152909150819073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610442919061084a565b101561047a576040517f0289a60100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104838161056a565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8616906323b872dd906064016020604051808303816000875af11580156104fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105209190610863565b50600983018790556040518181528790339086907fea32e0bbe6b44ae07c7113eff6123c3921029d514dc3383bfd3868da45f4f4049060200160405180910390a450505050505050565b6000806013018054806020026020016040519081016040528092919081815260200182805480156105d157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116105a6575b5050505050905060008060140180548060200260200160405190810160405280929190818152602001828054801561062857602002820191906000526020600020905b815481526020019060010190808311610614575b505050505090506000825190508151811461066f576040517fac9b143300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561071d57600061069f868584815181106106925761069261088c565b6020026020010151610724565b905080600060100160008785815181106106bb576106bb61088c565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff9081168352828201939093526040918201600090812060195490941681529290528120805490919061070f9084906108bb565b909155505050600101610672565b5050505050565b600061271061073383856108ce565b61073d919061080f565b90505b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461076a57600080fd5b919050565b6000806040838503121561078257600080fd5b61078b83610746565b946020939093013593505050565b6000602082840312156107ab57600080fd5b5035919050565b6000602082840312156107c457600080fd5b61073d82610746565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610740576107406107cd565b600082610845577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561085c57600080fd5b5051919050565b60006020828403121561087557600080fd5b8151801515811461088557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115610740576107406107cd565b8082028115828204841417610740576107406107cd56fea264697066735822122040e9f993341ab255cf589a16f2bfcfc747fbe9f7437ee081ec4668700b5f570264736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b5061091b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063675f4b7614610046578063efef39a11461006c578063fe315a1314610081575b600080fd5b61005961005436600461076f565b610166565b6040519081526020015b60405180910390f35b61007f61007a366004610799565b6102c5565b005b61015161008f3660046107b2565b60028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616845294815284832085516101608101875281548152600182015481840152948101548587015260038101546060860152600481015460808601529182015460a0850152600682015460c0850152600782015460e0850152600882015461010085015260098201546101208501819052600a9092015460ff16151561014090940193909352808252601290925291909120549091565b60408051928352602083019190915201610063565b6000818152601160209081526040808320546002548085526005845282852073ffffffffffffffffffffffffffffffffffffffff88168652845282852081865260049094529184209092908515806101c2575081600901548611155b806101cb575083155b15610202576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600982015460009081526011602052604090205461022090856107fc565b94504281600201541161025f576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6212750081600101544261027391906107fc565b1061028a5761028360028661080f565b94506102bb565b62093a8081600101544261029e91906107fc565b106102bb576102ae60048661080f565b6102b890866107fc565b94505b5050505092915050565b600081815260116020908152604080832054601754600254808652600585528386203387528552838620818752600490955292909420909373ffffffffffffffffffffffffffffffffffffffff169290851580610326575081600901548611155b8061032f575084155b15610366576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428160020154116103a3576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103af3388610166565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152909150819073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610442919061084a565b101561047a576040517f0289a60100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104838161056a565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8616906323b872dd906064016020604051808303816000875af11580156104fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105209190610863565b50600983018790556040518181528790339086907fea32e0bbe6b44ae07c7113eff6123c3921029d514dc3383bfd3868da45f4f4049060200160405180910390a450505050505050565b6000806013018054806020026020016040519081016040528092919081815260200182805480156105d157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116105a6575b5050505050905060008060140180548060200260200160405190810160405280929190818152602001828054801561062857602002820191906000526020600020905b815481526020019060010190808311610614575b505050505090506000825190508151811461066f576040517fac9b143300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561071d57600061069f868584815181106106925761069261088c565b6020026020010151610724565b905080600060100160008785815181106106bb576106bb61088c565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff9081168352828201939093526040918201600090812060175490941681529290528120805490919061070f9084906108bb565b909155505050600101610672565b5050505050565b600061271061073383856108ce565b61073d919061080f565b90505b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461076a57600080fd5b919050565b6000806040838503121561078257600080fd5b61078b83610746565b946020939093013593505050565b6000602082840312156107ab57600080fd5b5035919050565b6000602082840312156107c457600080fd5b61073d82610746565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610740576107406107cd565b600082610845577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561085c57600080fd5b5051919050565b60006020828403121561087557600080fd5b8151801515811461088557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115610740576107406107cd565b8082028115828204841417610740576107406107cd56fea26469706673582212209cd60a8d873556a41d6cea9fce1dc13de50ca47957d24f39f46be2ca442b5b5e64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063675f4b7614610046578063efef39a11461006c578063fe315a1314610081575b600080fd5b61005961005436600461076f565b610166565b6040519081526020015b60405180910390f35b61007f61007a366004610799565b6102c5565b005b61015161008f3660046107b2565b60028054600090815260056020818152604080842073ffffffffffffffffffffffffffffffffffffffff909616845294815284832085516101608101875281548152600182015481840152948101548587015260038101546060860152600481015460808601529182015460a0850152600682015460c0850152600782015460e0850152600882015461010085015260098201546101208501819052600a9092015460ff16151561014090940193909352808252601290925291909120549091565b60408051928352602083019190915201610063565b6000818152601160209081526040808320546002548085526005845282852073ffffffffffffffffffffffffffffffffffffffff88168652845282852081865260049094529184209092908515806101c2575081600901548611155b806101cb575083155b15610202576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600982015460009081526011602052604090205461022090856107fc565b94504281600201541161025f576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6212750081600101544261027391906107fc565b1061028a5761028360028661080f565b94506102bb565b62093a8081600101544261029e91906107fc565b106102bb576102ae60048661080f565b6102b890866107fc565b94505b5050505092915050565b600081815260116020908152604080832054601754600254808652600585528386203387528552838620818752600490955292909420909373ffffffffffffffffffffffffffffffffffffffff169290851580610326575081600901548611155b8061032f575084155b15610366576040517f5e8e11d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428160020154116103a3576040517fbf9dd13500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103af3388610166565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152909150819073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610442919061084a565b101561047a576040517f0289a60100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104838161056a565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8616906323b872dd906064016020604051808303816000875af11580156104fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105209190610863565b50600983018790556040518181528790339086907fea32e0bbe6b44ae07c7113eff6123c3921029d514dc3383bfd3868da45f4f4049060200160405180910390a450505050505050565b6000806013018054806020026020016040519081016040528092919081815260200182805480156105d157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116105a6575b5050505050905060008060140180548060200260200160405190810160405280929190818152602001828054801561062857602002820191906000526020600020905b815481526020019060010190808311610614575b505050505090506000825190508151811461066f576040517fac9b143300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561071d57600061069f868584815181106106925761069261088c565b6020026020010151610724565b905080600060100160008785815181106106bb576106bb61088c565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff9081168352828201939093526040918201600090812060175490941681529290528120805490919061070f9084906108bb565b909155505050600101610672565b5050505050565b600061271061073383856108ce565b61073d919061080f565b90505b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461076a57600080fd5b919050565b6000806040838503121561078257600080fd5b61078b83610746565b946020939093013593505050565b6000602082840312156107ab57600080fd5b5035919050565b6000602082840312156107c457600080fd5b61073d82610746565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610740576107406107cd565b600082610845577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561085c57600080fd5b5051919050565b60006020828403121561087557600080fd5b8151801515811461088557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115610740576107406107cd565b8082028115828204841417610740576107406107cd56fea26469706673582212209cd60a8d873556a41d6cea9fce1dc13de50ca47957d24f39f46be2ca442b5b5e64736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -128,7 +128,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0x51bdc4B651764384cC94772EE75858Ef80Df046B" + "address": "0x7707CB0e555B586b68ed7755119c44097B254a5B" }, "hardhat": { "artifact": { diff --git a/deployments/PausationFacet.json b/deployments/PausationFacet.json index 3c2c27f..5623e67 100644 --- a/deployments/PausationFacet.json +++ b/deployments/PausationFacet.json @@ -48,8 +48,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506101f9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80633f4ba83a146100465780635c975abb146100505780638456cb591461006a575b600080fd5b61004e610072565b005b60015460ff16604051901515815260200160405180910390f35b61004e6100e0565b61007a610151565b60015460ff166100b6576040517f73445b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6100e8610151565b60015460ff1615610125576040517f7859166400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101c1576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b56fea2646970667358221220993ab0929e9f4f1176ab40db2b06179c0bd75f2e98859abbabcd45fda7e0afa364736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633f4ba83a146100465780635c975abb146100505780638456cb591461006a575b600080fd5b61004e610072565b005b60015460ff16604051901515815260200160405180910390f35b61004e6100e0565b61007a610151565b60015460ff166100b6576040517f73445b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6100e8610151565b60015460ff1615610125576040517f7859166400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101c1576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b56fea2646970667358221220993ab0929e9f4f1176ab40db2b06179c0bd75f2e98859abbabcd45fda7e0afa364736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b506101f9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80633f4ba83a146100465780635c975abb146100505780638456cb591461006a575b600080fd5b61004e610072565b005b60015460ff16604051901515815260200160405180910390f35b61004e6100e0565b61007a610151565b60015460ff166100b6576040517f73445b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6100e8610151565b60015460ff1615610125576040517f7859166400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101c1576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b56fea264697066735822122048c00e892039cbb877d12613e91dbdfff7db65200a90d247cfe305508a8f0d5d64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80633f4ba83a146100465780635c975abb146100505780638456cb591461006a575b600080fd5b61004e610072565b005b60015460ff16604051901515815260200160405180910390f35b61004e6100e0565b61007a610151565b60015460ff166100b6576040517f73445b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6100e8610151565b60015460ff1615610125576040517f7859166400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c13205473ffffffffffffffffffffffffffffffffffffffff1633146101c1576040517fe1d7449900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b56fea264697066735822122048c00e892039cbb877d12613e91dbdfff7db65200a90d247cfe305508a8f0d5d64736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -58,7 +58,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0xC307958eFE78D781ec1B4E3B96FfAb7E33C6ac24" + "address": "0x71132573F9480373137d51441e5f58e99ad1809B" }, "hardhat": { "artifact": { diff --git a/deployments/UnlockFacet.json b/deployments/UnlockFacet.json index 3099f65..539134a 100644 --- a/deployments/UnlockFacet.json +++ b/deployments/UnlockFacet.json @@ -83,8 +83,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506106b7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636198e3391461003b5780636e99d52f14610050575b600080fd5b61004e610049366004610579565b61006c565b005b61005a6203f48081565b60405190815260200160405180910390f35b6002805460008181526005602090815260408083203384528252808320848452600490925290912092830154600782015492939192156100d8576040517fc7c233de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254851115610113576040517f3731776200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61011f85828585610248565b6000808061012e6000336102e5565b60ff1691509150811561014d5760008181526007602052604090205492505b600654600061015c8a8361039d565b9050610167816103bf565b60006127106101796203f480886105c1565b61018391906105d8565b6101906203f48042610613565b61019a9190610626565b90508681106101d5576040517ff1ddec3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101df828c610626565b8960060160008282546101f29190610613565b909155505060078901819055604080518c81526020810184905233918c917f264527c9df24015c81d07cee6ed0aaa3cb7dae31d37f68c16c15c9f8f89fba7b910160405180910390a35050505050505050505050565b6000620151806102584286610626565b61026291906105d8565b9050848360000160008282546102789190610626565b90915550610288905081866105c1565b83600201600082825461029b9190610626565b92505081905550848260050160008282546102b69190610626565b909155506102c6905081866105c1565b8260070160008282546102d99190610626565b90915550505050505050565b601a8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190610639565b905080156103945760019350600092505b50509250929050565b60006127106103ac83856105c1565b6103b691906105d8565b90505b92915050565b60008060090180548060200260200160405190810160405280929190818152602001828054801561042657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116103fb575b50505050509050600080600a0180548060200260200160405190810160405280929190818152602001828054801561047d57602002820191906000526020600020905b815481526020019060010190808311610469575b50505050509050600082519050815181146104c4576040517f8867301300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156105725760006104f4868584815181106104e7576104e7610652565b602002602001015161039d565b9050806000601001600087858151811061051057610510610652565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409182016000908120601754909416815292905281208054909190610564908490610613565b9091555050506001016104c7565b5050505050565b60006020828403121561058b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176103b9576103b9610592565b60008261060e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156103b9576103b9610592565b818103818111156103b9576103b9610592565b60006020828403121561064b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220518c44086e5ed5c7474cae50e537dd7b66d2f0f520948168b90a10d70015f3eb64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80636198e3391461003b5780636e99d52f14610050575b600080fd5b61004e610049366004610579565b61006c565b005b61005a6203f48081565b60405190815260200160405180910390f35b6002805460008181526005602090815260408083203384528252808320848452600490925290912092830154600782015492939192156100d8576040517fc7c233de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254851115610113576040517f3731776200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61011f85828585610248565b6000808061012e6000336102e5565b60ff1691509150811561014d5760008181526007602052604090205492505b600654600061015c8a8361039d565b9050610167816103bf565b60006127106101796203f480886105c1565b61018391906105d8565b6101906203f48042610613565b61019a9190610626565b90508681106101d5576040517ff1ddec3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101df828c610626565b8960060160008282546101f29190610613565b909155505060078901819055604080518c81526020810184905233918c917f264527c9df24015c81d07cee6ed0aaa3cb7dae31d37f68c16c15c9f8f89fba7b910160405180910390a35050505050505050505050565b6000620151806102584286610626565b61026291906105d8565b9050848360000160008282546102789190610626565b90915550610288905081866105c1565b83600201600082825461029b9190610626565b92505081905550848260050160008282546102b69190610626565b909155506102c6905081866105c1565b8260070160008282546102d99190610626565b90915550505050505050565b601a8201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190610639565b905080156103945760019350600092505b50509250929050565b60006127106103ac83856105c1565b6103b691906105d8565b90505b92915050565b60008060090180548060200260200160405190810160405280929190818152602001828054801561042657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116103fb575b50505050509050600080600a0180548060200260200160405190810160405280929190818152602001828054801561047d57602002820191906000526020600020905b815481526020019060010190808311610469575b50505050509050600082519050815181146104c4576040517f8867301300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156105725760006104f4868584815181106104e7576104e7610652565b602002602001015161039d565b9050806000601001600087858151811061051057610510610652565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409182016000908120601754909416815292905281208054909190610564908490610613565b9091555050506001016104c7565b5050505050565b60006020828403121561058b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176103b9576103b9610592565b60008261060e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156103b9576103b9610592565b818103818111156103b9576103b9610592565b60006020828403121561064b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220518c44086e5ed5c7474cae50e537dd7b66d2f0f520948168b90a10d70015f3eb64736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b506106b7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80636198e3391461003b5780636e99d52f14610050575b600080fd5b61004e610049366004610579565b61006c565b005b61005a6203f48081565b60405190815260200160405180910390f35b6002805460008181526005602090815260408083203384528252808320848452600490925290912092830154600782015492939192156100d8576040517fc7c233de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254851115610113576040517f3731776200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61011f85828585610248565b6000808061012e6000336102e5565b60ff1691509150811561014d5760008181526007602052604090205492505b600654600061015c8a8361039d565b9050610167816103bf565b60006127106101796203f480886105c1565b61018391906105d8565b6101906203f48042610613565b61019a9190610626565b90508681106101d5576040517ff1ddec3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101df828c610626565b8960060160008282546101f29190610613565b909155505060078901819055604080518c81526020810184905233918c917f264527c9df24015c81d07cee6ed0aaa3cb7dae31d37f68c16c15c9f8f89fba7b910160405180910390a35050505050505050505050565b6000620151806102584286610626565b61026291906105d8565b9050848360000160008282546102789190610626565b90915550610288905081866105c1565b83600201600082825461029b9190610626565b92505081905550848260050160008282546102b69190610626565b909155506102c6905081866105c1565b8260070160008282546102d99190610626565b90915550505050505050565b60188201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190610639565b905080156103945760019350600092505b50509250929050565b60006127106103ac83856105c1565b6103b691906105d8565b90505b92915050565b60008060090180548060200260200160405190810160405280929190818152602001828054801561042657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116103fb575b50505050509050600080600a0180548060200260200160405190810160405280929190818152602001828054801561047d57602002820191906000526020600020905b815481526020019060010190808311610469575b50505050509050600082519050815181146104c4576040517f8867301300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156105725760006104f4868584815181106104e7576104e7610652565b602002602001015161039d565b9050806000601001600087858151811061051057610510610652565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409182016000908120601554909416815292905281208054909190610564908490610613565b9091555050506001016104c7565b5050505050565b60006020828403121561058b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176103b9576103b9610592565b60008261060e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156103b9576103b9610592565b818103818111156103b9576103b9610592565b60006020828403121561064b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220477d4373b6c48b4829062b0eb1c53fcd5327c3a0ca83a3fb05f7785c2017860f64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80636198e3391461003b5780636e99d52f14610050575b600080fd5b61004e610049366004610579565b61006c565b005b61005a6203f48081565b60405190815260200160405180910390f35b6002805460008181526005602090815260408083203384528252808320848452600490925290912092830154600782015492939192156100d8576040517fc7c233de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254851115610113576040517f3731776200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61011f85828585610248565b6000808061012e6000336102e5565b60ff1691509150811561014d5760008181526007602052604090205492505b600654600061015c8a8361039d565b9050610167816103bf565b60006127106101796203f480886105c1565b61018391906105d8565b6101906203f48042610613565b61019a9190610626565b90508681106101d5576040517ff1ddec3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101df828c610626565b8960060160008282546101f29190610613565b909155505060078901819055604080518c81526020810184905233918c917f264527c9df24015c81d07cee6ed0aaa3cb7dae31d37f68c16c15c9f8f89fba7b910160405180910390a35050505050505050505050565b6000620151806102584286610626565b61026291906105d8565b9050848360000160008282546102789190610626565b90915550610288905081866105c1565b83600201600082825461029b9190610626565b92505081905550848260050160008282546102b69190610626565b909155506102c6905081866105c1565b8260070160008282546102d99190610626565b90915550505050505050565b60188201546040517f773c02d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009283929116908290829063773c02d490602401602060405180830381865afa15801561035f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103839190610639565b905080156103945760019350600092505b50509250929050565b60006127106103ac83856105c1565b6103b691906105d8565b90505b92915050565b60008060090180548060200260200160405190810160405280929190818152602001828054801561042657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116103fb575b50505050509050600080600a0180548060200260200160405190810160405280929190818152602001828054801561047d57602002820191906000526020600020905b815481526020019060010190808311610469575b50505050509050600082519050815181146104c4576040517f8867301300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156105725760006104f4868584815181106104e7576104e7610652565b602002602001015161039d565b9050806000601001600087858151811061051057610510610652565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409182016000908120601554909416815292905281208054909190610564908490610613565b9091555050506001016104c7565b5050505050565b60006020828403121561058b57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176103b9576103b9610592565b60008261060e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808201808211156103b9576103b9610592565b818103818111156103b9576103b9610592565b60006020828403121561064b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220477d4373b6c48b4829062b0eb1c53fcd5327c3a0ca83a3fb05f7785c2017860f64736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -93,7 +93,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0x60B3cd74058FE140a6D3EE244A3D77a50d100572" + "address": "0x98c7d936A6a130D1828E437F63e1b9b9F1432f6F" }, "hardhat": { "artifact": { diff --git a/deployments/WithdrawFacet.json b/deployments/WithdrawFacet.json index f7a7198..dd45973 100644 --- a/deployments/WithdrawFacet.json +++ b/deployments/WithdrawFacet.json @@ -48,8 +48,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610245806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80636fcd112b14610030575b600080fd5b61003861003a565b005b33600081815260086020908152604080832054808452600583528184208585529092528220600681015460078201549293919290918290036100a8576040517f1138da8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428111156100e2576040517f6a3fb10500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006840181905560078401556017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018d91906101e6565b508473ffffffffffffffffffffffffffffffffffffffff16847fb43a979cf5312add838538436575cdc00ab42ae32fed507f6447ec4658acbe85846040516101d791815260200190565b60405180910390a35050505050565b6000602082840312156101f857600080fd5b8151801515811461020857600080fd5b939250505056fea2646970667358221220e55ccbbe089f538220d6f8c0201126a45b6901bf9a007237645bc76ed1c429bb64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80636fcd112b14610030575b600080fd5b61003861003a565b005b33600081815260086020908152604080832054808452600583528184208585529092528220600681015460078201549293919290918290036100a8576040517f1138da8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428111156100e2576040517f6a3fb10500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006840181905560078401556017546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018d91906101e6565b508473ffffffffffffffffffffffffffffffffffffffff16847fb43a979cf5312add838538436575cdc00ab42ae32fed507f6447ec4658acbe85846040516101d791815260200190565b60405180910390a35050505050565b6000602082840312156101f857600080fd5b8151801515811461020857600080fd5b939250505056fea2646970667358221220e55ccbbe089f538220d6f8c0201126a45b6901bf9a007237645bc76ed1c429bb64736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b50610245806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80636fcd112b14610030575b600080fd5b61003861003a565b005b33600081815260086020908152604080832054808452600583528184208585529092528220600681015460078201549293919290918290036100a8576040517f1138da8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428111156100e2576040517f6a3fb10500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006840181905560078401556015546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018d91906101e6565b508473ffffffffffffffffffffffffffffffffffffffff16847fb43a979cf5312add838538436575cdc00ab42ae32fed507f6447ec4658acbe85846040516101d791815260200190565b60405180910390a35050505050565b6000602082840312156101f857600080fd5b8151801515811461020857600080fd5b939250505056fea2646970667358221220bf44f602101812b7bc331d9ec9d05b2a3e29b2843d79798f0ea678b6f5a1465c64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80636fcd112b14610030575b600080fd5b61003861003a565b005b33600081815260086020908152604080832054808452600583528184208585529092528220600681015460078201549293919290918290036100a8576040517f1138da8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428111156100e2576040517f6a3fb10500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006840181905560078401556015546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af1158015610169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018d91906101e6565b508473ffffffffffffffffffffffffffffffffffffffff16847fb43a979cf5312add838538436575cdc00ab42ae32fed507f6447ec4658acbe85846040516101d791815260200190565b60405180910390a35050505050565b6000602082840312156101f857600080fd5b8151801515811461020857600080fd5b939250505056fea2646970667358221220bf44f602101812b7bc331d9ec9d05b2a3e29b2843d79798f0ea678b6f5a1465c64736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} }, @@ -58,7 +58,7 @@ "log": true, "skipIfAlreadyDeployed": true }, - "address": "0x0be993dA67E862da6179640aDEBEE36dc4C028F9" + "address": "0xE005C7d028Cb8041163330f2A123197aEfC50361" }, "hardhat": { "artifact": { diff --git a/hardhat.config.ts b/hardhat.config.ts index 32d6593..7ba3b11 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -12,6 +12,7 @@ import './tasks/season' import './tasks/startSeason' import './tasks/diamondInfo' import './tasks/admin' +import './tasks/updateMiningPassFees' import { formatUnits, parseUnits } from 'ethers' diff --git a/scripts/migrateFuji.ts b/scripts/migrateFuji.ts new file mode 100644 index 0000000..b3d2623 --- /dev/null +++ b/scripts/migrateFuji.ts @@ -0,0 +1,120 @@ +import { ethers, network } from 'hardhat' +import LiquidMiningDiamond from '../deployments/LiquidMiningDiamond.json' +import { deployContract } from '../utils/deployContract' +import { addOrReplaceFacets } from '../utils/diamond' +import getFacets from '../utils/getFacets' +import { addresses, ChainId } from '../config/addresses' +import { BURN_WALLET } from '../config/constants' + +/** + * Fuji Migration Script + * + * Mirrors exactly what the fork test's `_upgradeAndMigrate()` does: + * 1. Deploy FujiMigrationInit + * 2. Deploy all facets (except DiamondCutFacet & DiamondLoupeFacet) + * 3. Encode init(Args) with real Fuji fee receiver addresses + * 4. Call addOrReplaceFacets with the init contract + calldata + * + * The migration initializer: + * - Reads GENERAL scalars from old Fuji slots 25-30 + * - Writes them to production slots 21-26 + * - Re-initializes all mapping/array config data + * + * Usage: + * yarn hardhat run --network fuji scripts/migrateFuji.ts + */ +async function main() { + if (network.name !== 'fuji') { + throw new Error( + `This script is ONLY for fuji. Current network: ${network.name}` + ) + } + + const CHAIN_ID = ChainId.AVALANCHE_TESTNET.toString() + + const diamondAddress = + LiquidMiningDiamond[network.name as keyof typeof LiquidMiningDiamond] + .address + + console.log(`💎 Diamond address: ${diamondAddress}`) + console.log(`📡 Network: ${network.name}`) + + // ─── 1. Deploy FujiMigrationInit ─── + console.log('\n1️⃣ Deploying FujiMigrationInit...') + const migrationInit = await deployContract('FujiMigrationInit', { + args: [], + log: true, + skipIfAlreadyDeployed: false, // always deploy fresh + }) + const migrationInitAddress = await migrationInit.getAddress() + console.log(` FujiMigrationInit deployed at: ${migrationInitAddress}`) + + // ─── 2. Deploy all facets ─── + console.log('\n2️⃣ Deploying facets...') + const FacetNames = getFacets(['DiamondCutFacet', 'DiamondLoupeFacet']) + console.log(` Facets to deploy: ${FacetNames.join(', ')}`) + + const Facets = [] + for (const name of FacetNames) { + Facets.push(await deployContract(name)) + } + + // ─── 3. Build migration init calldata ─── + console.log('\n3️⃣ Building migration init calldata...') + + // Real Fuji fee receiver addresses (same as DiamondInit / deployDiamond.ts) + const labsMultisig = addresses.teamMultisig[CHAIN_ID] + const replenishmentPool = addresses.vpndReplenishmentPool[CHAIN_ID] + const xVAPE = addresses.xVAPE[CHAIN_ID] + const passport = addresses.passportPool[CHAIN_ID] + + console.log(` labsMultisig: ${labsMultisig}`) + console.log(` replenishmentPool: ${replenishmentPool}`) + console.log(` xVAPE: ${xVAPE}`) + console.log(` passport: ${passport}`) + console.log(` burnWallet: ${BURN_WALLET}`) + + // Match DiamondInit.sol fee receiver structure exactly + const migrationArgs = { + // Unlock: replenishmentPool 80%, labsMultisig 10%, burnWallet 10% + unlockFeeReceivers: [replenishmentPool, labsMultisig, BURN_WALLET], + unlockFeeReceiversShares: [8000, 1000, 1000], + // Boost: labsMultisig 60%, xVAPE 30%, passport 10% + boostFeeReceivers: [labsMultisig, xVAPE, passport], + boostFeeReceiversShares: [6000, 3000, 1000], + // Mining pass: xVAPE 65%, labsMultisig 30%, passport 5% + miningPassFeeReceivers: [xVAPE, labsMultisig, passport], + miningPassFeeReceiversShares: [6500, 3000, 500], + } + + const initCalldata = migrationInit.interface.encodeFunctionData('init', [ + migrationArgs, + ]) + + console.log(` Calldata length: ${initCalldata.length} chars`) + + // ─── 4. Execute diamondCut with migration init ─── + console.log('\n4️⃣ Executing diamondCut (addOrReplaceFacets + migration init)...') + await addOrReplaceFacets( + Facets, + diamondAddress, + migrationInitAddress, + initCalldata, + undefined // no Safe — direct EOA tx + ) + + console.log('\n✅ Fuji migration complete!') + console.log( + ' Storage has been migrated from 14f06c0 layout to production layout.' + ) + console.log( + ' All facets replaced and mapping/array data re-initialized.' + ) +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error('❌ Migration failed:', error) + process.exit(1) + }) diff --git a/tasks/updateMiningPassFees.ts b/tasks/updateMiningPassFees.ts new file mode 100644 index 0000000..50ce69c --- /dev/null +++ b/tasks/updateMiningPassFees.ts @@ -0,0 +1,104 @@ +import { task } from 'hardhat/config' +import LiquidMiningDiamond from '../deployments/LiquidMiningDiamond.json' +import { logTx } from '../utils' + +const REFERENCE_VAPE_PRICE = 0.606 +const FLOOR_BPS = 2500 // 25% +const NUM_TIERS = 11 + +async function fetchVAPEPrice(): Promise { + const response = await fetch( + 'https://api.coingecko.com/api/v3/simple/price?ids=vaporfi&vs_currencies=usd' + ) + const data = (await response.json()) as { vaporfi?: { usd?: number } } + const price = data.vaporfi?.usd + if (!price) throw new Error('Failed to fetch VAPE price from CoinGecko') + return price +} + +function calculateDynamicFees( + baseFees: bigint[], + vapePrice: number, + floorBps: number +): bigint[] { + const multiplierBps = Math.floor((vapePrice / REFERENCE_VAPE_PRICE) * 10000) + + return baseFees.map((baseFee) => { + const floorFee = (baseFee * BigInt(floorBps)) / 10000n + const dynamicFee = (baseFee * BigInt(multiplierBps)) / 10000n + return dynamicFee > floorFee ? dynamicFee : floorFee + }) +} + +task( + 'mining-pass:update-fees', + 'Update mining pass fees based on current VAPE price' +) + .addOptionalParam('vapePrice', 'Override VAPE price (USD) instead of fetching') + .addFlag('dryRun', 'Print what would happen without sending transactions') + .setAction(async ({ vapePrice, dryRun }, { ethers, network }) => { + const diamondAddress = + LiquidMiningDiamond[network.name as keyof typeof LiquidMiningDiamond] + .address + + const DiamondManagerFacet = await ethers.getContractAt( + 'DiamondManagerFacet', + diamondAddress + ) + + // ── 1. Fetch VAPE price ────────────────────────────────────────── + const currentVAPEPrice = vapePrice + ? parseFloat(vapePrice) + : await fetchVAPEPrice() + + console.log(`\n💰 VAPE Price: $${currentVAPEPrice.toFixed(4)}`) + console.log( + `📐 Multiplier: ${((currentVAPEPrice / REFERENCE_VAPE_PRICE) * 100).toFixed(1)}% of reference ($${REFERENCE_VAPE_PRICE})` + ) + + // ── 2. Read base fees from contract ────────────────────────────── + const baseFees: bigint[] = [] + for (let i = 0; i < NUM_TIERS; i++) { + const fee = await DiamondManagerFacet.getBaseMiningPassTierFee(i) + baseFees.push(fee) + } + + // ── 3. Read current fees from contract ─────────────────────────── + const currentFees: bigint[] = [] + for (let i = 0; i < NUM_TIERS; i++) { + const fee = await DiamondManagerFacet.getMiningPassTierFee(i) + currentFees.push(fee) + } + + // ── 4. Calculate dynamic fees ──────────────────────────────────── + const dynamicFees = calculateDynamicFees( + baseFees, + currentVAPEPrice, + FLOOR_BPS + ) + + console.log('\n📋 Mining Pass Fee Update:') + console.log('Tier | Base Fee ($) | Current ($) | New Fee ($) | Change') + console.log('-----|-------------|-------------|-------------|-------') + for (let i = 0; i < NUM_TIERS; i++) { + const base = Number(baseFees[i]) / 1e6 + const current = Number(currentFees[i]) / 1e6 + const dynamic = Number(dynamicFees[i]) / 1e6 + const change = + base > 0 ? `${(((dynamic - base) / base) * 100).toFixed(0)}%` : '-' + console.log( + ` ${i.toString().padStart(2)} | ${base.toFixed(2).padStart(11)} | ${current.toFixed(2).padStart(11)} | ${dynamic.toFixed(2).padStart(11)} | ${change}` + ) + } + + if (dryRun) { + console.log('\n🏁 Dry run complete — no transactions sent.') + return + } + + // ── 5. Update mining pass fees ─────────────────────────────────── + console.log('\n⏳ Updating mining pass fees...') + const feesTx = await DiamondManagerFacet.setMiningPassFees(dynamicFees) + await logTx(feesTx) + console.log('✅ Mining pass fees updated') + }) From 0194c6c4c2783f11151f8867a9a2bdb3e0ade797 Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Wed, 25 Feb 2026 20:36:06 +0530 Subject: [PATCH 5/7] chore: clean tests --- test/foundry/fork/FujiForkMiningPass.t.sol | 191 +++++++-------------- 1 file changed, 58 insertions(+), 133 deletions(-) diff --git a/test/foundry/fork/FujiForkMiningPass.t.sol b/test/foundry/fork/FujiForkMiningPass.t.sol index 1335fa0..44b3f0b 100644 --- a/test/foundry/fork/FujiForkMiningPass.t.sol +++ b/test/foundry/fork/FujiForkMiningPass.t.sol @@ -3,31 +3,15 @@ pragma solidity 0.8.18; import "forge-std/Test.sol"; import {IERC20} from "openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {IDiamondCut} from "clouds/interfaces/IDiamondCut.sol"; import {IDiamondLoupe} from "clouds/interfaces/IDiamondLoupe.sol"; import {DiamondManagerFacet} from "src/facets/DiamondManagerFacet.sol"; import {MiningPassFacet} from "src/facets/MiningPassFacet.sol"; -import {BoostFacet} from "src/facets/BoostFacet.sol"; -import {DepositFacet} from "src/facets/DepositFacet.sol"; -import {ClaimFacet} from "src/facets/ClaimFacet.sol"; -import {UnlockFacet} from "src/facets/UnlockFacet.sol"; -import {WithdrawFacet} from "src/facets/WithdrawFacet.sol"; -import {FeeCollectorFacet} from "src/facets/FeeCollectorFacet.sol"; -import {AuthorizationFacet} from "src/facets/AuthorizationFacet.sol"; -import {PausationFacet} from "src/facets/PausationFacet.sol"; -import {FujiMigrationInit} from "src/upgradeInitializers/FujiMigrationInit.sol"; /// @title FujiForkMiningPassTest -/// @notice Fork test against the real Fuji diamond to verify the storage -/// migration from the 14f06c0 layout to the production layout. -/// -/// Fuji was deployed at commit 14f06c0 which placed GENERAL fields -/// (depositToken, rewardToken, feeToken) at slots 25-27. Production -/// has them at slots 21-23. -/// -/// The migration initializer reads scalars from old slots 25-30, -/// writes them to production slots 21-26, then re-initializes all -/// mapping/array config data that moved between slot numbers. +/// @notice Post-migration fork tests against the live Fuji diamond. +/// Verifies that the storage layout matches production (GENERAL at +/// slots 21-26), dynamic pricing getters work, and mining pass +/// purchases use USDC (not VPND). contract FujiForkMiningPassTest is Test { // ──── Real Fuji addresses ──── address constant DIAMOND = 0xEd98549D4dE52811b3b417A717E3d74AC90F9Ffe; @@ -56,76 +40,77 @@ contract FujiForkMiningPassTest is Test { } // ═══════════════════════════════════════════════════════════════════ - // PRE-MIGRATION STORAGE CHECK + // STORAGE SLOT VERIFICATION // ═══════════════════════════════════════════════════════════════════ - /// @notice Confirm that on-chain Fuji storage has GENERAL fields at - /// the OLD 14f06c0 slots (25-28), not production slots (21-24). - function test_Fork_PreMigration_OldSlotLayout() public { - // Old Fuji 14f06c0 layout: GENERAL at slots 25-28 - address slot25 = _readAddress(25); - address slot26 = _readAddress(26); - address slot27 = _readAddress(27); - address slot28 = _readAddress(28); - - console.log("Pre-migration (old Fuji slots 25-28):"); - console.log(" slot 25:", slot25); - console.log(" slot 26:", slot26); - console.log(" slot 27:", slot27); - console.log(" slot 28:", slot28); - - assertEq(slot25, VPND, "old slot 25 should be VPND (depositToken)"); - assertEq(slot26, VAPE, "old slot 26 should be VAPE (rewardToken)"); - assertEq(slot27, USDC, "old slot 27 should be USDC (feeToken)"); - assertEq(slot28, STRATOSPHERE, "old slot 28 should be stratosphere"); - - // Production slots 21-24 should NOT have these values yet - address slot21 = _readAddress(21); - address slot23 = _readAddress(23); - assertTrue(slot21 != VPND, "prod slot 21 should NOT have VPND yet"); - assertTrue(slot23 != USDC, "prod slot 23 should NOT have USDC yet"); + /// @notice Verify GENERAL fields are at production-compatible slots 21-26 + function test_Fork_StorageSlots_GeneralSection() public { + assertEq(_readAddress(21), VPND, "slot 21 = depositToken = VPND"); + assertEq(_readAddress(22), VAPE, "slot 22 = rewardToken = VAPE"); + assertEq(_readAddress(23), USDC, "slot 23 = feeToken = USDC"); + assertEq(_readAddress(24), STRATOSPHERE, "slot 24 = stratosphere"); + + // slot 25 = reentrancyGuardStatus (uint256, should be 0 or 1) + uint256 reentrancy = uint256(vm.load(DIAMOND, bytes32(uint256(25)))); + assertTrue(reentrancy <= 2, "slot 25 = reentrancyGuardStatus <= 2"); + + // slot 28 = miningPassFeeFloorBps + uint256 floorBps = uint256(vm.load(DIAMOND, bytes32(uint256(28)))); + assertEq(floorBps, 2500, "slot 28 = miningPassFeeFloorBps = 2500"); } // ═══════════════════════════════════════════════════════════════════ - // POST-MIGRATION STORAGE CHECK + // FACET GETTER VERIFICATION // ═══════════════════════════════════════════════════════════════════ - /// @notice After the full migration, GENERAL fields should be at - /// production slots (21-26) and facet reads should work. - function test_Fork_AfterMigration_FeeTokenIsUSDC() public { - _upgradeAndMigrate(); + /// @notice Verify facet getters return correct values after migration + function test_Fork_FacetGetters() public { + // General getters + assertEq(diamond.getStratosphereAddress(), STRATOSPHERE, "stratosphere getter"); - // Verify raw storage at production slots - assertEq(_readAddress(21), VPND, "prod slot 21 = depositToken = VPND"); - assertEq(_readAddress(22), VAPE, "prod slot 22 = rewardToken = VAPE"); - assertEq(_readAddress(23), USDC, "prod slot 23 = feeToken = USDC"); - assertEq(_readAddress(24), STRATOSPHERE, "prod slot 24 = stratosphere"); + // Dynamic pricing getters + uint256 floorBps = diamond.getMiningPassFeeFloorBps(); + assertEq(floorBps, 2500, "floor should be 2500 bps"); - // Old Fuji slot 27 should be cleared (was USDC/feeToken before migration) - assertEq(_readAddress(27), address(0), "old slot 27 should be cleared"); - // Slot 28 is now miningPassFeeFloorBps (= 2500), NOT an old address slot - assertEq(uint256(vm.load(DIAMOND, bytes32(uint256(28)))), 2500, "slot 28 = miningPassFeeFloorBps = 2500"); + // Mining pass tier fees should be set (tier 0 = free, tier 1+ > 0) + assertEq(diamond.getMiningPassTierFee(0), 0, "tier 0 is free"); + assertTrue(diamond.getMiningPassTierFee(1) > 0, "tier 1 fee > 0"); - // Verify via facet getters - assertEq(diamond.getStratosphereAddress(), STRATOSPHERE, "stratosphere getter works"); + // Base fees should match current fees (initially equal) + uint256 baseFee1 = diamond.getBaseMiningPassTierFee(1); + assertTrue(baseFee1 > 0, "base fee tier 1 > 0"); - // Verify mining pass fees were re-initialized - uint256 tier1Fee = diamond.getMiningPassTierFee(1); - console.log("Tier 1 fee:", tier1Fee); - assertEq(tier1Fee, 0.5 * 1e6, "tier 1 fee should be 0.5 USDC"); + // Floor fee should be baseFee * floorBps / 10000 + uint256 floorFee1 = diamond.getMiningPassTierFloorFee(1); + assertEq(floorFee1, (baseFee1 * floorBps) / 10000, "floor fee = baseFee * 2500 / 10000"); - uint256 floorBps = diamond.getMiningPassFeeFloorBps(); - assertEq(floorBps, 2500, "floor should be 2500 bps"); + // getAllMiningPassFees should return 11 entries + uint256[] memory allFees = diamond.getAllMiningPassFees(); + assertEq(allFees.length, 11, "should have 11 tiers"); + assertEq(allFees[0], 0, "tier 0 free in array"); + + // Deposit limits + uint256 limit0 = diamond.getMiningPassTierDepositLimit(0); + uint256 limit1 = diamond.getMiningPassTierDepositLimit(1); + assertTrue(limit0 > 0, "tier 0 deposit limit > 0"); + assertTrue(limit1 > limit0, "tier 1 limit > tier 0 limit"); + + console.log("Tier 1 fee:", diamond.getMiningPassTierFee(1)); + console.log("Tier 1 base fee:", baseFee1); + console.log("Tier 1 floor fee:", floorFee1); } - /// @notice Full e2e: migrate -> purchase mining pass -> only USDC is spent - function test_Fork_AfterMigration_PurchaseUsesUSDC() public { - _upgradeAndMigrate(); + // ═══════════════════════════════════════════════════════════════════ + // E2E PURCHASE TEST + // ═══════════════════════════════════════════════════════════════════ + + /// @notice Purchase a mining pass and verify USDC is spent (not VPND) + function test_Fork_PurchaseUsesUSDC() public { _ensureActiveSeason(); - uint256 fee = diamond.getMiningPassTierFee(1); + // Use getMiningPassFee which accounts for time-based discounts + uint256 fee = miningPass.getMiningPassFee(user, 1); require(fee > 0, "fee is 0"); - console.log("Tier 1 fee:", fee); deal(USDC, user, fee * 10); deal(VPND, user, fee * 10); @@ -157,66 +142,6 @@ contract FujiForkMiningPassTest is Test { return address(uint160(uint256(vm.load(DIAMOND, bytes32(slot))))); } - /// @dev Upgrade ALL facets + run the FujiMigrationInit initializer in a - /// single diamondCut call — exactly how the real upgrade will work. - function _upgradeAndMigrate() internal { - // Deploy the migration initializer - FujiMigrationInit migrationInit = new FujiMigrationInit(); - - // Build cuts array: deploy new facets, look up old facet via loupe, replace - IDiamondCut.FacetCut[] memory cuts = _buildAllFacetCuts(); - - // Encode the migration initializer call - FujiMigrationInit.Args memory migArgs = _buildMigrationArgs(); - - vm.prank(owner); - IDiamondCut(DIAMOND) - .diamondCut(cuts, address(migrationInit), abi.encodeWithSelector(FujiMigrationInit.init.selector, migArgs)); - } - - function _buildAllFacetCuts() internal returns (IDiamondCut.FacetCut[] memory cuts) { - cuts = new IDiamondCut.FacetCut[](10); - cuts[0] = _deployAndReplace(address(new DiamondManagerFacet()), DiamondManagerFacet.setDepositToken.selector); - cuts[1] = _deployAndReplace(address(new MiningPassFacet()), MiningPassFacet.purchase.selector); - cuts[2] = _deployAndReplace(address(new BoostFacet()), BoostFacet.claimBoost.selector); - cuts[3] = _deployAndReplace(address(new DepositFacet()), DepositFacet.deposit.selector); - cuts[4] = _deployAndReplace(address(new ClaimFacet()), ClaimFacet.automatedClaim.selector); - cuts[5] = _deployAndReplace(address(new UnlockFacet()), UnlockFacet.unlock.selector); - cuts[6] = _deployAndReplace(address(new WithdrawFacet()), WithdrawFacet.withdrawUnlocked.selector); - cuts[7] = _deployAndReplace(address(new FeeCollectorFacet()), FeeCollectorFacet.collectBoostFees.selector); - cuts[8] = _deployAndReplace(address(new AuthorizationFacet()), AuthorizationFacet.authorize.selector); - cuts[9] = _deployAndReplace(address(new PausationFacet()), PausationFacet.pause.selector); - } - - function _deployAndReplace(address newFacet, bytes4 knownSelector) - internal - view - returns (IDiamondCut.FacetCut memory) - { - address oldFacet = loupe.facetAddress(knownSelector); - bytes4[] memory selectors = loupe.facetFunctionSelectors(oldFacet); - return IDiamondCut.FacetCut({ - facetAddress: newFacet, action: IDiamondCut.FacetCutAction.Replace, functionSelectors: selectors - }); - } - - function _buildMigrationArgs() internal returns (FujiMigrationInit.Args memory migArgs) { - migArgs.unlockFeeReceivers = new address[](1); - migArgs.unlockFeeReceivers[0] = makeAddr("unlockFeeReceiver"); - migArgs.unlockFeeReceiversShares = new uint256[](1); - migArgs.unlockFeeReceiversShares[0] = 10000; - - migArgs.boostFeeReceivers = new address[](1); - migArgs.boostFeeReceivers[0] = makeAddr("boostFeeReceiver"); - migArgs.boostFeeReceiversShares = new uint256[](1); - migArgs.boostFeeReceiversShares[0] = 10000; - - migArgs.miningPassFeeReceivers = new address[](1); - migArgs.miningPassFeeReceivers[0] = makeAddr("miningPassFeeReceiver"); - migArgs.miningPassFeeReceiversShares = new uint256[](1); - migArgs.miningPassFeeReceiversShares[0] = 10000; - } - function _ensureActiveSeason() internal { uint256 seasonId = diamond.getCurrentSeasonId(); if (seasonId == 0) { From 6b463e42f5e811e5a6b6d991b405038d4ac61ba0 Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Wed, 25 Feb 2026 20:43:59 +0530 Subject: [PATCH 6/7] fix: event emition for single-tier mutates --- src/facets/DiamondManagerFacet.sol | 17 +++++++++--- .../Facets/MiningPassDynamicPricing.t.sol | 27 ++++++++++++++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/facets/DiamondManagerFacet.sol b/src/facets/DiamondManagerFacet.sol index 183b35b..f40362f 100644 --- a/src/facets/DiamondManagerFacet.sol +++ b/src/facets/DiamondManagerFacet.sol @@ -41,6 +41,7 @@ contract DiamondManagerFacet { event SeasonEnded(uint256 indexed seasonId, uint256 rewardTokenDistributed); event MiningPassFeeReceiversSet(address[] receivers, uint256[] proportion); event MiningPassFeesUpdated(uint256[] fees); + event MiningPassTierFeeUpdated(uint256 indexed tier, uint256 fee); event BaseMiningPassFeesUpdated(uint256[] fees); event MiningPassFeeFloorUpdated(uint256 floorBps); @@ -180,9 +181,7 @@ contract DiamondManagerFacet { s.miningPassTierToFee[tier] = fee; - uint256[] memory fees = new uint256[](1); - fees[0] = fee; - emit MiningPassFeesUpdated(fees); + emit MiningPassTierFeeUpdated(tier, fee); } /// @notice Update base mining pass fees for all tiers @@ -210,6 +209,18 @@ contract DiamondManagerFacet { if (floorBps > TOTAL_SHARES) { revert DiamondManagerFacet__Invalid_Input(); } + + // Validate that no existing tier fee falls below the new floor + for (uint256 i = 1; i < 11;) { + uint256 floorFee = (s.baseMiningPassTierToFee[i] * floorBps) / TOTAL_SHARES; + if (s.miningPassTierToFee[i] < floorFee) { + revert DiamondManagerFacet__FeeBelowFloor(); + } + unchecked { + i++; + } + } + s.miningPassFeeFloorBps = floorBps; emit MiningPassFeeFloorUpdated(floorBps); } diff --git a/test/foundry/Facets/MiningPassDynamicPricing.t.sol b/test/foundry/Facets/MiningPassDynamicPricing.t.sol index fb84f62..71877ab 100644 --- a/test/foundry/Facets/MiningPassDynamicPricing.t.sol +++ b/test/foundry/Facets/MiningPassDynamicPricing.t.sol @@ -12,6 +12,8 @@ error DiamondManagerFacet__FeeBelowFloor(); error DiamondManagerFacet__InvalidTier(); contract MiningPassDynamicPricingTest is DiamondTest { + event MiningPassTierFeeUpdated(uint256 indexed tier, uint256 fee); + LiquidMiningDiamond internal diamond; DiamondManagerFacet internal diamondManagerFacet; MiningPassFacet internal miningPassFacet; @@ -183,6 +185,9 @@ contract MiningPassDynamicPricingTest is DiamondTest { // Update tier 5 to 50% of original uint256 newFee = originalFees[5] / 2; // $4 instead of $8 + + vm.expectEmit(true, false, false, true, address(diamond)); + emit MiningPassTierFeeUpdated(5, newFee); diamondManagerFacet.setMiningPassTierFee(5, newFee); assertEq(diamondManagerFacet.getMiningPassTierFee(5), newFee); @@ -221,7 +226,7 @@ contract MiningPassDynamicPricingTest is DiamondTest { function test_SetMiningPassFeeFloor() public { vm.startPrank(owner); - // Change floor to 50% + // Current fees equal base fees (100%), so raising floor to 50% is safe diamondManagerFacet.setMiningPassFeeFloor(5000); assertEq(diamondManagerFacet.getMiningPassFeeFloorBps(), 5000); @@ -231,6 +236,26 @@ contract MiningPassDynamicPricingTest is DiamondTest { vm.stopPrank(); } + function test_SetMiningPassFeeFloor_RevertIf_ExistingFeeBelowNewFloor() public { + vm.startPrank(owner); + + // Lower fees to 30% of base + uint256[] memory lowFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + lowFees[i] = (originalFees[i] * 3000) / 10000; // 30% + } + diamondManagerFacet.setMiningPassFees(lowFees); + + // Try to raise floor to 50% — existing fees (30%) < new floor (50%) + vm.expectRevert(DiamondManagerFacet__FeeBelowFloor.selector); + diamondManagerFacet.setMiningPassFeeFloor(5000); + + // Floor should remain unchanged + assertEq(diamondManagerFacet.getMiningPassFeeFloorBps(), 2500); + + vm.stopPrank(); + } + function test_SetMiningPassFeeFloor_RevertIf_InvalidValue() public { vm.startPrank(owner); From f5dffa24cfa93699fc6aeb3f7b5bb6fadd0bffdc Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Thu, 26 Feb 2026 23:06:10 +0530 Subject: [PATCH 7/7] chore: add prod fork test --- test/foundry/fork/ProdForkUpgrade.t.sol | 409 ++++++++++++++++++++++++ 1 file changed, 409 insertions(+) create mode 100644 test/foundry/fork/ProdForkUpgrade.t.sol diff --git a/test/foundry/fork/ProdForkUpgrade.t.sol b/test/foundry/fork/ProdForkUpgrade.t.sol new file mode 100644 index 0000000..be36fb0 --- /dev/null +++ b/test/foundry/fork/ProdForkUpgrade.t.sol @@ -0,0 +1,409 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.18; + +import "forge-std/Test.sol"; +import {IERC20} from "openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IDiamondCut} from "clouds/interfaces/IDiamondCut.sol"; +import {IDiamondLoupe} from "clouds/interfaces/IDiamondLoupe.sol"; +import {DiamondManagerFacet} from "src/facets/DiamondManagerFacet.sol"; +import {MiningPassFacet} from "src/facets/MiningPassFacet.sol"; + +/// @title ProdForkUpgradeTest +/// @notice Fork test against the real Avalanche mainnet diamond. +/// Simulates upgrading DiamondManagerFacet with the new dynamic-pricing +/// version and verifies: +/// 1. All existing storage slots are preserved (no corruption) +/// 2. New getters work after upgrade +/// 3. Owner can initialise dynamic pricing config +/// 4. Mining pass purchase still works with USDC +contract ProdForkUpgradeTest is Test { + // ──── Real mainnet addresses ──── + address constant DIAMOND = 0xAe950fdd0CC79DDE64d3Fffd40fabec3f7ba368B; + address constant VPND = 0x83a283641C6B4DF383BCDDf807193284C84c5342; + address constant USDC = 0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E; + address constant VAPE = 0x7bddaF6DbAB30224AA2116c4291521C7a60D5f55; + address constant STRAT = 0x08e287adCf9BF6773a87e1a278aa9042BEF44b60; + address constant EMISSIONS = 0x9f0EDB45c2DC0f56bA7C48368c26426f366Bb788; + + // Fee receivers (from DiamondInit / config) + address constant xVAPE = 0x0fA2CCC39Cc3B225A7649eD84ec76Ee5217d07c4; + address constant LABS_MULTISIG = 0x6769DB4e3E94A63089f258B9500e0695586315bA; + address constant PASSPORT = 0x125177daa21AF2277A2B735212B115c2A302940F; + + // Base mining pass fees (from DiamondInit) + uint256[11] BASE_FEES = + [uint256(0), 0.5 * 1e6, 1 * 1e6, 2 * 1e6, 4 * 1e6, 8 * 1e6, 15 * 1e6, 30 * 1e6, 50 * 1e6, 75 * 1e6, 100 * 1e6]; + + DiamondManagerFacet diamond; + MiningPassFacet miningPass; + IDiamondLoupe loupe; + address owner; + address user; + + // ── Pre-upgrade snapshots ── + bytes32[31] slotsBefore; + uint256 seasonIdBefore; + address stratBefore; + + function setUp() public { + vm.createSelectFork("avalanche"); + + diamond = DiamondManagerFacet(DIAMOND); + miningPass = MiningPassFacet(DIAMOND); + loupe = IDiamondLoupe(DIAMOND); + user = makeAddr("testUser"); + + (bool ok, bytes memory data) = DIAMOND.staticcall(abi.encodeWithSignature("owner()")); + require(ok, "owner() call failed"); + owner = abi.decode(data, (address)); + + // ── Snapshot all scalar slots 0-30 before upgrade ── + for (uint256 i; i < 31; i++) { + slotsBefore[i] = vm.load(DIAMOND, bytes32(i)); + } + + // ── Snapshot via getters ── + seasonIdBefore = diamond.getCurrentSeasonId(); + stratBefore = diamond.getStratosphereAddress(); + } + + // ═══════════════════════════════════════════════════════════════════ + // PRE-UPGRADE SANITY: EXISTING LAYOUT + // ═══════════════════════════════════════════════════════════════════ + + /// @notice Verify the current production layout before we touch anything + function test_ProdFork_PreUpgrade_StorageLayout() public { + assertEq(_readAddress(21), VPND, "slot 21 = depositToken = VPND"); + assertEq(_readAddress(22), VAPE, "slot 22 = rewardToken = VAPE"); + assertEq(_readAddress(23), USDC, "slot 23 = feeToken = USDC"); + assertEq(_readAddress(24), STRAT, "slot 24 = stratosphere"); + assertEq(_readAddress(26), EMISSIONS, "slot 26 = emissionsManager"); + + console.log("Pre-upgrade: currentSeasonId =", seasonIdBefore); + console.log("Pre-upgrade: owner =", owner); + } + + // ═══════════════════════════════════════════════════════════════════ + // POST-UPGRADE: STORAGE PRESERVATION + // ═══════════════════════════════════════════════════════════════════ + + /// @notice After upgrading DiamondManagerFacet, ALL existing storage + /// slots must be identical. The upgrade only adds new selectors + /// — no initializer, no storage writes. + function test_ProdFork_PostUpgrade_SlotsPreserved() public { + _upgradeDiamondManagerFacet(); + + // Verify all 31 scalar slots are unchanged + for (uint256 i; i < 31; i++) { + bytes32 slotAfter = vm.load(DIAMOND, bytes32(i)); + assertEq(slotAfter, slotsBefore[i], string.concat("slot ", vm.toString(i), " changed after upgrade")); + } + + // Verify getters still return the same values + assertEq(diamond.getCurrentSeasonId(), seasonIdBefore, "seasonId changed"); + assertEq(diamond.getStratosphereAddress(), stratBefore, "stratosphere changed"); + } + + // ═══════════════════════════════════════════════════════════════════ + // POST-UPGRADE: GENERAL SLOT INTEGRITY + // ═══════════════════════════════════════════════════════════════════ + + /// @notice Verify GENERAL section (slots 21-26) is intact after upgrade + function test_ProdFork_PostUpgrade_GeneralSlots() public { + _upgradeDiamondManagerFacet(); + + assertEq(_readAddress(21), VPND, "slot 21 = depositToken"); + assertEq(_readAddress(22), VAPE, "slot 22 = rewardToken"); + assertEq(_readAddress(23), USDC, "slot 23 = feeToken"); + assertEq(_readAddress(24), STRAT, "slot 24 = stratosphere"); + assertEq(_readAddress(26), EMISSIONS, "slot 26 = emissionsManager"); + } + + // ═══════════════════════════════════════════════════════════════════ + // POST-UPGRADE: NEW GETTERS (UNINITIALISED) + // ═══════════════════════════════════════════════════════════════════ + + /// @notice New dynamic pricing getters should work but return zero/defaults + /// since production hasn't initialised baseMiningPassTierToFee yet. + function test_ProdFork_PostUpgrade_NewGettersDefaults() public { + _upgradeDiamondManagerFacet(); + + // baseMiningPassTierToFee (slot 27 mapping) — uninitialised → 0 + for (uint256 i; i < 11; i++) { + assertEq(diamond.getBaseMiningPassTierFee(i), 0, "base fee should be 0 before init"); + } + + // miningPassFeeFloorBps (slot 28) — uninitialised → 0 + assertEq(diamond.getMiningPassFeeFloorBps(), 0, "floor bps should be 0 before init"); + + // getAllMiningPassFees should return the EXISTING fees (they were + // already set in miningPassTierToFee mapping at slot 17) + uint256[] memory fees = diamond.getAllMiningPassFees(); + assertEq(fees.length, 11, "should have 11 tiers"); + // Existing fees should be present (production had them set via DiamondInit) + console.log("Existing tier 1 fee:", fees[1]); + console.log("Existing tier 10 fee:", fees[10]); + } + + // ═══════════════════════════════════════════════════════════════════ + // POST-UPGRADE: INITIALISE DYNAMIC PRICING + // ═══════════════════════════════════════════════════════════════════ + + /// @notice Owner sets base fees, floor, then updates dynamic fees. + /// Simulates the exact post-upgrade admin sequence. + function test_ProdFork_PostUpgrade_InitialiseDynamicPricing() public { + _upgradeDiamondManagerFacet(); + + vm.startPrank(owner); + + // 1. Set base fees + uint256[] memory baseFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + baseFees[i] = BASE_FEES[i]; + } + diamond.setBaseMiningPassFees(baseFees); + + // Verify base fees stored + for (uint256 i; i < 11; i++) { + assertEq(diamond.getBaseMiningPassTierFee(i), BASE_FEES[i], "base fee mismatch"); + } + + // 2. Set floor to 25% + diamond.setMiningPassFeeFloor(2500); + assertEq(diamond.getMiningPassFeeFloorBps(), 2500, "floor not set"); + + // 3. Verify floor fee calculation + // Floor for tier 10: 100 USDC * 25% = 25 USDC + assertEq(diamond.getMiningPassTierFloorFee(10), 25 * 1e6, "tier 10 floor fee"); + + // 4. Set dynamic fees (e.g. at 80% of base) + uint256[] memory dynamicFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + dynamicFees[i] = (BASE_FEES[i] * 8000) / 10000; // 80% + } + diamond.setMiningPassFees(dynamicFees); + + // Verify dynamic fees + for (uint256 i; i < 11; i++) { + assertEq(diamond.getMiningPassTierFee(i), dynamicFees[i], "dynamic fee mismatch"); + } + + // 5. Try setting a single tier fee + diamond.setMiningPassTierFee(5, 6 * 1e6); // $6 + assertEq(diamond.getMiningPassTierFee(5), 6 * 1e6, "single tier fee"); + + // 6. Verify floor enforcement: try setting below floor + vm.expectRevert(abi.encodeWithSignature("DiamondManagerFacet__FeeBelowFloor()")); + diamond.setMiningPassTierFee(10, 20 * 1e6); // $20 < $25 floor + + // 7. Verify floor elevation enforcement + // Lower fees to 30%, then try to raise floor to 50% + for (uint256 i; i < 11; i++) { + dynamicFees[i] = (BASE_FEES[i] * 3000) / 10000; // 30% + } + diamond.setMiningPassFees(dynamicFees); + + vm.expectRevert(abi.encodeWithSignature("DiamondManagerFacet__FeeBelowFloor()")); + diamond.setMiningPassFeeFloor(5000); // 50% > current 30% → should revert + + vm.stopPrank(); + } + + // ═══════════════════════════════════════════════════════════════════ + // POST-UPGRADE: E2E PURCHASE + // ═══════════════════════════════════════════════════════════════════ + + /// @notice Full e2e: upgrade → init pricing → purchase → verify USDC spent + function test_ProdFork_PostUpgrade_PurchaseUsesUSDC() public { + _upgradeDiamondManagerFacet(); + _initDynamicPricing(); + _ensureActiveSeason(); + + uint256 fee = miningPass.getMiningPassFee(user, 1); + require(fee > 0, "tier 1 fee is 0"); + console.log("Tier 1 purchase fee:", fee); + + deal(USDC, user, fee * 10); + deal(VPND, user, fee * 10); + + uint256 usdcBefore = IERC20(USDC).balanceOf(user); + uint256 vpndBefore = IERC20(VPND).balanceOf(user); + + vm.startPrank(user); + IERC20(USDC).approve(DIAMOND, type(uint256).max); + IERC20(VPND).approve(DIAMOND, type(uint256).max); + miningPass.purchase(1); + vm.stopPrank(); + + uint256 usdcSpent = usdcBefore - IERC20(USDC).balanceOf(user); + uint256 vpndSpent = vpndBefore - IERC20(VPND).balanceOf(user); + + console.log("USDC spent:", usdcSpent); + console.log("VPND spent:", vpndSpent); + + assertEq(usdcSpent, fee, "USDC should be spent"); + assertEq(vpndSpent, 0, "VPND should NOT be spent"); + + // Verify mining pass assigned + (uint256 tier,) = miningPass.miningPassOf(user); + assertEq(tier, 1, "user should have tier 1 pass"); + } + + // ═══════════════════════════════════════════════════════════════════ + // POST-UPGRADE: EVENT VERIFICATION + // ═══════════════════════════════════════════════════════════════════ + + /// @notice Verify the new MiningPassTierFeeUpdated event is emitted + function test_ProdFork_PostUpgrade_TierFeeEvent() public { + _upgradeDiamondManagerFacet(); + _initDynamicPricing(); + + vm.startPrank(owner); + + vm.expectEmit(true, false, false, true, DIAMOND); + emit MiningPassTierFeeUpdated(5, 6 * 1e6); + diamond.setMiningPassTierFee(5, 6 * 1e6); + + vm.stopPrank(); + } + + // ═══════════════════════════════════════════════════════════════════ + // HELPERS + // ═══════════════════════════════════════════════════════════════════ + + event MiningPassTierFeeUpdated(uint256 indexed tier, uint256 fee); + + function _readAddress(uint256 slot) internal view returns (address) { + return address(uint160(uint256(vm.load(DIAMOND, bytes32(slot))))); + } + + /// @dev Deploy a new DiamondManagerFacet and replace its selectors via diamondCut + function _upgradeDiamondManagerFacet() internal { + DiamondManagerFacet newFacet = new DiamondManagerFacet(); + + // Use a known selector to find the old facet address + address oldFacet = loupe.facetAddress(DiamondManagerFacet.setDepositToken.selector); + bytes4[] memory oldSelectors = loupe.facetFunctionSelectors(oldFacet); + + // Build a Replace cut for existing selectors + IDiamondCut.FacetCut[] memory cuts; + + // Check if new facet has MORE selectors than old (new getters added) + // We do Replace for existing, Add for new + bytes4[] memory newSelectors = _getNewFacetSelectors(address(newFacet), oldSelectors); + + if (newSelectors.length > 0) { + cuts = new IDiamondCut.FacetCut[](2); + cuts[0] = IDiamondCut.FacetCut({ + facetAddress: address(newFacet), + action: IDiamondCut.FacetCutAction.Replace, + functionSelectors: oldSelectors + }); + cuts[1] = IDiamondCut.FacetCut({ + facetAddress: address(newFacet), action: IDiamondCut.FacetCutAction.Add, functionSelectors: newSelectors + }); + } else { + cuts = new IDiamondCut.FacetCut[](1); + cuts[0] = IDiamondCut.FacetCut({ + facetAddress: address(newFacet), + action: IDiamondCut.FacetCutAction.Replace, + functionSelectors: oldSelectors + }); + } + + vm.prank(owner); + IDiamondCut(DIAMOND).diamondCut(cuts, address(0), ""); + } + + /// @dev Discover selectors on the new facet that don't exist on the old facet + function _getNewFacetSelectors(address, bytes4[] memory oldSelectors) internal pure returns (bytes4[] memory) { + // Get ALL selectors from the new facet by querying the loupe for what + // the new facet exposes. Since it's not registered yet, we use a + // brute-force approach: check known new selectors. + bytes4[] memory candidates = new bytes4[](10); + uint256 count; + + // New selectors added by the dynamic pricing PR + bytes4[10] memory potentialNew = [ + DiamondManagerFacet.setMiningPassFees.selector, + DiamondManagerFacet.setMiningPassTierFee.selector, + DiamondManagerFacet.setBaseMiningPassFees.selector, + DiamondManagerFacet.setMiningPassFeeFloor.selector, + DiamondManagerFacet.getMiningPassTierFee.selector, + DiamondManagerFacet.getBaseMiningPassTierFee.selector, + DiamondManagerFacet.getMiningPassTierFloorFee.selector, + DiamondManagerFacet.getMiningPassFeeFloorBps.selector, + DiamondManagerFacet.getAllMiningPassFees.selector, + DiamondManagerFacet.getMiningPassTierDepositLimit.selector + ]; + + for (uint256 i; i < 10; i++) { + bool isOld; + for (uint256 j; j < oldSelectors.length; j++) { + if (potentialNew[i] == oldSelectors[j]) { + isOld = true; + break; + } + } + if (!isOld) { + candidates[count] = potentialNew[i]; + count++; + } + } + + // Also check getSeasonIsClaimed + bytes4 seasonClaimedSel = DiamondManagerFacet.getSeasonIsClaimed.selector; + { + bool isOld; + for (uint256 j; j < oldSelectors.length; j++) { + if (seasonClaimedSel == oldSelectors[j]) { + isOld = true; + break; + } + } + if (!isOld) { + candidates[count] = seasonClaimedSel; + count++; + } + } + + bytes4[] memory result = new bytes4[](count); + for (uint256 i; i < count; i++) { + result[i] = candidates[i]; + } + return result; + } + + /// @dev Initialise dynamic pricing config (simulates post-upgrade admin actions) + function _initDynamicPricing() internal { + vm.startPrank(owner); + + uint256[] memory baseFees = new uint256[](11); + for (uint256 i; i < 11; i++) { + baseFees[i] = BASE_FEES[i]; + } + diamond.setBaseMiningPassFees(baseFees); + diamond.setMiningPassFeeFloor(2500); + + vm.stopPrank(); + } + + function _ensureActiveSeason() internal { + uint256 seasonId = diamond.getCurrentSeasonId(); + if (seasonId == 0) { + vm.prank(owner); + diamond.startNewSeasonWithEndTimestamp(1000 * 1e18, block.timestamp + 30 days); + return; + } + + try diamond.getSeasonEndTimestamp(seasonId) returns (uint256 endTs) { + if (endTs <= block.timestamp) { + vm.prank(owner); + diamond.startNewSeasonWithEndTimestamp(1000 * 1e18, block.timestamp + 30 days); + } + } catch { + vm.prank(owner); + diamond.startNewSeasonWithEndTimestamp(1000 * 1e18, block.timestamp + 30 days); + } + } +}