diff --git a/abis/SuperPaymaster.json b/abis/SuperPaymaster.json index 303d039e..568c3f63 100644 --- a/abis/SuperPaymaster.json +++ b/abis/SuperPaymaster.json @@ -1088,6 +1088,11 @@ "name": "user", "type": "address", "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" } ], "outputs": [], @@ -2937,5 +2942,5 @@ "inputs": [] } ], - "bytecode": "0x6101003461029257601f6160e838819003918201601f19168301916001600160401b03831184841017610296578084926060946040528339810103126102925780516001600160a01b0381169190828103610292576020820151916001600160a01b038316830361029257604001516001600160a01b038116939084900361029257331561027f575f8054336001600160a01b0319821681178355604051939290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a33060805215610248575060a0525f5160206160c85f395f51905f525460ff8160401c16610239576002600160401b03196001600160401b038216016101e3575b506001805566470de4df8200006009556103e8600d5560c05260e052604051615e1d90816102ab8239608051818181613134015261328d015260a051818181610d520152818161104c015281816110fa0152818161138d0152818161162001528181611edc015281816131db015281816138c50152613d82015260c0518181816108760152818161179a0152818161292b01528181612b7301528181613d2e015281816155750152818161580f01526158f6015260e0518181816115dc0152818161258401528181612f3a0152615ab90152f35b6001600160401b0319166001600160401b039081175f5160206160c85f395f51905f52556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f61010f565b63f92ee8a960e01b5f5260045ffd5b62461bcd60e51b8152602060048201526012602482015271125b9d985b1a5908115b9d1c9e541bda5b9d60721b6044820152606490fd5b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f5f3560e01c80630396cb6014613d5257806306433b1b14613d0e5780630761581514613ced578063079d2d4214613b925780630c88311214613b7157806313e7c9d814613ab457806317a1877814613a615780631928c2e51461394a5780631d2282c914613929578063205c2878146138985780632540c471146138295780632608c9e6146136e35780632e1a7d4d146135f45780632f4f21e21461352157806334fde76a146135035780633d63f215146134e55780634382885d146134be5780634ee1a3d61461348f5780634f1ef2861461323c57806352b7512c1461319357806352d1902d1461311957806353afb8be14612e8357806354fd4d5014612e2257806358a2570a14612dae578063594a6f2314612d905780635c7c4b5f14612b085780635d2e7e5014612a4e5780635f4cd4fe146128c457806360a9139b1461289d57806360d7442b1461288057806361ad446e1461286257806361d027b31461283b5780636640431f146127d957806366c36875146127a1578063673a7e281461255e5780636a16e22d1461253a5780636a4b23b11461244d5780636d8a4aff14612426578063715018a6146123d45780637344209c1461205c57806374f053c41461203557806375e09b5114612017578063761cda3314611fe7578063787dce3d14611f875780637af3816c14611f695780637b70718514611f1b5780637c627b2114611e8f57806382309dd814611e6457806384450c3d14611d835780638670d78d14611d3857806388a7ca5c14611c1f5780638da5cb5b14611bf95780638e0d8ed914611bde5780638e58021314611b41578063928624e714611b0957806396daa32214611aeb57806396ea1e3814611991578063a0c5018b146118f7578063a134d63a146117f4578063a3970ae614611780578063a4b5328f1461168d578063ad3cb1cc14611644578063b0d691fe14611600578063b0f0abe9146115bc578063b54a8fca1461150b578063b6b55f251461143b578063b7b76cbe14611415578063bac256d6146113f7578063bb2ddb27146113d9578063bb9fe6bf14611369578063bd1118701461134b578063bfa5a1eb14611252578063c06f58e81461122b578063c1d9cb081461115a578063c23a5cea146110cd578063c399ec881461101f578063c50cff8714610fc9578063cf756fdf14610db9578063d0e30db014610d33578063d20727d714610c9d578063d4c38f5214610bd8578063dc61ae9014610a9b578063ddd595ca14610a7d578063de5c62a614610a56578063e21b38d214610a28578063e8ade1a91461098c578063eafe74b514610825578063ec2123f114610759578063ef842a461461070b578063f0f4426014610688578063f2fde38b14610637578063f5c91a0814610591578063f60fdcb31461054a578063f7e8cb0d1461050d578063fc347007146104645763fe719e2f1461043a575f80fd5b34610461578060031936011261046157602065ffffffffffff815460a01c16604051908152f35b80fd5b50346104615760203660031901126104615760043565ffffffffffff811690818103610509576104926158b5565b338352600560205260016040842001907fffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff82549165ffffffffffff60c01b9060c01b1691161790556040519081527f4419a541734858dec04cd4ea31aff7b399a0b82dc61f30cc777c1907dc8102ed60203392a280f35b8280fd5b50346104615760203660031901126104615760ff60406020926001600160a01b03610536613dee565b168152600784522054166040519015158152f35b50346104615780600319360112610461576080600a5460ff600b54600c5490604051938452602084015269ffffffffffffffffffff8116604084015260501c166060820152f35b5034610461576040366003190112610461576105ab613dee565b602435906105b7614eee565b63ffffffff8211610628576001600160a01b03168083526005602090815260408420600101805463ffffffff60a01b191660a085901b63ffffffff60a01b1617905590917ffc577563f1b9a0461e24abef1e1fcc0d33d3d881f20b5df6dda59de4aae2c8219190604051908152a280f35b634163383f60e11b8352600483fd5b503461046157602036600319011261046157610651613dee565b610659614eee565b6001600160a01b038116156106745761067190615935565b80f35b631e4fbdf760e01b82526004829052602482fd5b5034610461576020366003190112610461576001600160a01b036106aa613dee565b6106b2614eee565b1680156106fc57600454816001600160a01b0382167f4ab5be82436d353e61ca18726e984e561f5c1cc7c6d38b29d2553c790434705a8580a36001600160a01b0319161760045580f35b63e6c4247b60e01b8252600482fd5b5034610461576040366003190112610461576001600160a01b03604061072f613dee565b9282610739613e04565b94168152601c6020522091165f52602052602060405f2054604051908152f35b503461046157602036600319011261046157600435610776614eee565b66038d7ea4c6800081108015610813575b6108045760095490816107cc575b7ffcc60d1b1dedb59d33b8eef97db5a70c8f8f8523c70d6a027dbf676f1290f8d2918160409260095582519182526020820152a180f35b612710612328830204811080156107f3575b15610795575b63c52a9bd360e01b8352600483fd5b50612710612af883020481116107de565b63c52a9bd360e01b8252600482fd5b50683635c9adc5dea000008111610787565b50346104615760403660031901126104615761083f613dee565b90610848613e04565b916001600160a01b0360405191632c333e2560e01b8352168060048301526020826024816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa918215610981578392610946575b506001600160a01b039360246020926040519687938492634d3c739760e11b84526004840152165afa90811561093b578291610902575b60209350818111156108fb576108f39250614668565b604051908152f35b50506108f3565b90506020833d602011610933575b8161091d60209383613f41565b8101031261092f5760209251906108dd565b5f80fd5b3d9150610910565b6040513d84823e3d90fd5b9091506020813d602011610979575b8161096260209383613f41565b8101031261092f5751906001600160a01b036108a6565b3d9150610955565b6040513d85823e3d90fd5b5034610461576001600160a01b036109a336614177565b91906109ad614eee565b1690818352600560205260408320805460ff60881b83151560881b169060ff60881b19161790555f14610a01577fc5437eb8dd091f69800961953f2bb0bc16ae1ff2d3e52caa96796db65f8271da8280a280f35b7fae02c1bd695006b6d891af37fdeefea45a10ebcc17071e3471787db4f17728858280a280f35b5034610461576020366003190112610461576020610a4c610a47613dee565b614e7b565b6040519015158152f35b503461046157806003193601126104615760206001600160a01b0360175416604051908152f35b5034610461578060031936011261046157602060405162093a808152f35b50346104615780600319360112610461576013548015610bc957610e108101809111610bb5574210610ba65760145480600a5542600b556a08000000000000000000006affffffffffffffffffffff19600c541617600c5560125460ff81169060018203610b61575b505081601355816014557ffb96594f297e98363f469f68dba1862f6b4e6dbe060a9fd971f41087b2bb21066020604051838152a142907fdb6fb3cf4cc5fb760bcd63b958a53b2396776dff32c063188e864296541e76bd8380a380f35b7f5e5763e2a601dbb21ceae7f64e18f3d572378b373daa8d75a325f22f377f0ecb60406001938151908152846020820152a160ff191617601255426015555f80610b04565b63174b336d60e21b8152600490fd5b634e487b7160e01b82526011600452602482fd5b63a24a147160e01b8252600482fd5b503461046157602036600319011261046157610bf2613dee565b610bfa615699565b338252601c602052604082206001600160a01b0382165f5260205260405f2054908115610c84576001600160a01b0390338452601c602052604084208282165f526020528360405f20551690610c5181338461577c565b6040519081527fdd3840d6dd5c33bfa3b3743f47978de59805ce10f5170e1659be2936e489d73e60203392a36001805580f35b63cf47918160e01b835260048390526001602452604483fd5b5034610461576020366003190112610461576001600160a01b03610cbf613dee565b610cc7614eee565b1680156106fc57806001600160a01b0319601d541617601d5562093a804201804211610d1f576020817f98f60c65a2b39c6b97ac2ab59944af0f43d99c0d1756339e5c607fd64341971c92601e55604051908152a280f35b634e487b7160e01b83526011600452602483fd5b508060031936011261046157610d47614eee565b806001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803b15610db657816024916040519283809263b760faf960e01b825230600483015234905af1801561093b57610da55750f35b81610daf91613f41565b6104615780f35b50fd5b503461046157608036600319011261046157610dd3613dee565b610ddb613e04565b906044356001600160a01b03811691828203610fc557606435925f516020615dc85f395f51905f52549460ff8660401c16159567ffffffffffffffff811680159081610fbd575b6001149081610fb3575b159081610faa575b50610f9b5767ffffffffffffffff1981166001175f516020615dc85f395f51905f525586610f6f575b506001600160a01b03831615610f605760ff5f516020615dc85f395f51905f525460401c1615610f5157906001600160a01b038392610e9d829695615935565b168419600254161760025515155f14610f4a57505b166001600160a01b031960045416176004558015155f14610f41575b60165566470de4df8200006009556103e8600d55610ee95780f35b68ff0000000000000000195f516020615dc85f395f51905f5254165f516020615dc85f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b50610e10610ece565b9050610eb2565b631afcd79f60e31b8752600487fd5b6349e27cff60e01b8752600487fd5b68ffffffffffffffffff191668010000000000000001175f516020615dc85f395f51905f52555f610e5d565b63f92ee8a960e01b8852600488fd5b9050155f610e34565b303b159150610e2c565b889150610e22565b8480fd5b503461046157604036600319011261046157610fe3613dee565b60243590610fef614eee565b6101f48211611010576001600160a01b03168252601a602052604082205580f35b6358d620b360e01b8352600483fd5b50346104615780600319360112610461576040516370a0823160e01b8152306004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156110c1579061108e575b602090604051908152f35b506020813d6020116110b9575b816110a860209383613f41565b8101031261092f5760209051611083565b3d915061109b565b604051903d90823e3d90fd5b503461046157602036600319011261046157806110e8613dee565b6110f0614eee565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690813b15611156576001600160a01b036024849283604051958694859363611d2e7560e11b85521660048401525af1801561093b57610da55750f35b5050fd5b5034610461576020366003190112610461576001600160a01b0361117c613dee565b82608060405161118b81613f09565b828152826020820152826040820152606080820152015216808252600860205260408220541561121c5780825260086020526040822090825260086020526040822054915f198301928311611208576112046111f06111ea858561400a565b50614e30565b604051918291602083526020830190614130565b0390f35b634e487b7160e01b81526011600452602490fd5b63e0a1dc3160e01b8252600482fd5b503461046157806003193601126104615760206001600160a01b03600e5416604051908152f35b50346104615760803660031901126104615761126c613dee565b9060243560038110156113475760643567ffffffffffffffff811161050957611299903690600401613e2e565b6112a4949194614eee565b65ffffffffffff42166001600160a01b03831690818652601f60205265ffffffffffff60408720541681106113385762015180019065ffffffffffff8211611324579185969161131a936106719752601f60205265ffffffffffff60408920911665ffffffffffff198254161790553691613f7f565b9160443591614f14565b634e487b7160e01b86526011600452602486fd5b63be3963ef60e01b8652600486fd5b5080fd5b50346104615780600319360112610461576020601654604051908152f35b5034610461578060031936011261046157611382614eee565b806001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803b15610db65781809160046040518094819363bb9fe6bf60e01b83525af1801561093b57610da55750f35b50346104615780600319360112610461576020601e54604051908152f35b50346104615780600319360112610461576020601954604051908152f35b503461046157806003193601126104615760206001600160a01b03815416604051908152f35b503461046157602036600319011261046157600435611458615699565b6114606158b5565b611479816001600160a01b036002541630903390615874565b6001600160801b0381116114fc573382526005602052604082206001600160801b036114aa81841682845416614695565b166001600160801b03198254161790556114c681600f5461422c565b600f556040519081527f06653c045d0a3144153a51ac6909baae43b8d5b67184cb74e988b72858727fe460203392a26001805580f35b6354ada05560e01b8252600482fd5b5034610461576020366003190112610461576001600160a01b0361152d613dee565b611535614eee565b1680156106fc576020546201518042018042116115a8576001600160d01b0319909116821760a091821b65ffffffffffff60a01b161760208181556040519190921c65ffffffffffff1681527f0b969f7dbdbaad518bf93d6f72458e8fd633fe345297219a90f56b035d14468d9190a280f35b634e487b7160e01b84526011600452602484fd5b503461046157806003193601126104615760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461046157806003193601126104615760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461046157806003193601126104615750611204604051611667604082613f41565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613fb5565b5034610461576040366003190112610461576116a7613dee565b6024356116b2614eee565b6116ba615699565b6001600160a01b0382169182156117715760105467016345785d8a000081111561176b5767016345785d89ffff198101818111611324575b831161175c579161174e8160209361172b827ff7595c4fd7fa675e456dd9520ac8266c06d237d52900fc573bccc85b7c177c9e97614668565b60105561173a82600f54614668565b600f556001600160a01b036002541661577c565b604051908152a26001805580f35b63b4aa806360e01b8552600485fd5b846116f2565b63e6c4247b60e01b8452600484fd5b50346104615761178f36614177565b906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036117e6576001600160a01b031682526007602052604082209060ff80198354169115151617905580f35b6282b42960e81b8352600483fd5b5034610461576020366003190112610461576001600160a01b03611816613dee565b168152600860205260408120805467ffffffffffffffff81116118e3576040519061184760208260051b0183613f41565b80825260208201809385526020852085915b8383106118c557868587604051928392602084019060208552518091526040840160408260051b8601019392905b82821061189657505050500390f35b919360019193955060206118b58192603f198a82030186528851614130565b9601920192018594939192611887565b600560206001926118d585614e30565b815201920192019190611859565b634e487b7160e01b83526041600452602483fd5b5034610461578060031936011261046157611910614eee565b6020546001600160a01b0381169081156107e45765ffffffffffff8160a01c1665ffffffffffff4216106107e457600e80546001600160a01b0319811684179091556001600160d01b03199091166020556001600160a01b03167f019f532f6e08ee8944dc2e7ac40f3c97ad4a20618aee847ddf7c502821c7dad48380a380f35b5034610461576020366003190112610461576004356119ae614eee565b81811315611adc576119be615aa4565b15611acd576015548015159081611ab6575b50611aa757600a5482811315611a9857611f40810290801591818105611f4014831715611a8457612710900591612ee08202918205612ee01417156115a8576127109005908212908115611a7a575b50611a6b578060145542601355610e104201804211610d1f577f028dfa1d2bc951d60682384a066c9424c3829ea5f25cb00a5f659caed927faea9160409182519182526020820152a180f35b636b04933560e01b8252600482fd5b905081135f611a1f565b634e487b7160e01b85526011600452602485fd5b63b41b6cb160e01b8352600483fd5b6304a1a56160e41b8252600482fd5b905062093a808101809111610d1f5742115f6119d0565b6304efd15560e41b8252600482fd5b63b41b6cb160e01b8252600482fd5b50346104615780600319360112610461576020600d54604051908152f35b50346104615760203660031901126104615760406020916001600160a01b03611b30613dee565b168152601a83522054604051908152f35b503461046157604036600319011261046157611b5b613dee565b6001600160a01b0360243591168252600860205260408220805482101561050957611b86925061400a565b508054600182015491611204611bd360028301549260ff6004611bab6003840161406f565b920154169360405196879687526020870152604086015260a0606086015260a0850190613fb5565b91608084019061410f565b50346104615780600319360112610461576020610a4c615aa4565b50346104615780600319360112610461576001600160a01b036020915416604051908152f35b503461046157608036600319011261046157611c39613dee565b50611c42613e04565b6044359060643567ffffffffffffffff8111611d3457611c66903690600401613e2e565b5050611c70615699565b6001600160a01b036002541633036117e657611c8b816157bd565b6001600160801b038211611d25577f06653c045d0a3144153a51ac6909baae43b8d5b67184cb74e988b72858727fe49160406001600160a01b03602093169485815260058452206001600160801b03611ce981841682845416614695565b166001600160801b0319825416179055611d0581600f5461422c565b600f55604051908152a260018055604051632229f29760e21b8152602090f35b6354ada05560e01b8352600483fd5b8380fd5b5034610461576020366003190112610461576001600160a01b03611d5a613dee565b168152601a60205260409020548015611d7857602090604051908152f35b5060206019546108f3565b5034610461578060031936011261046157611d9c614eee565b601d546001600160a01b0381169081156107e457601e5442106107e457600f5460105480911490811591611e52575b506107e45760025490826001600160a01b038316926001600160a01b031916176002556001600160a01b031916601d5582601e5581817fbbb759660e3239a80c3b3a0326287b69c8a5388b2ba43876c6b91c7c85f21fb86020604051428152a37f75f4cc3f3f70100dc11e396f47f8af2dec5cf7ec94e06062222be779cf2f3dec8380a380f35b67016345785d8a00009150115f611dcb565b50346104615780600319360112610461576020611e7f614dfe565b65ffffffffffff60405191168152f35b503461046157608036600319011261046157600360043510156104615760243567ffffffffffffffff811161134757611ecf611f14913690600401613e2e565b611f036001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633146146b5565b611f0b615699565b60443591614bc7565b6001805580f35b5034610461576040366003190112610461576001600160a01b036040611f3f613dee565b9282611f49613e04565b9416815260116020522091165f52602052602060405f2054604051908152f35b50346104615780600319360112610461576020601054604051908152f35b503461046157602036600319011261046157600435611fa4614eee565b6107d081116108045760407fb404cac19fb1cbeff98d325795b08886e3cd8fe8cb1a2f193aac66f13fb239c391600d549080600d5582519182526020820152a180f35b50346104615760603660031901126104615760206108f3612006613dee565b61200e613e04565b60443591614b7e565b50346104615780600319360112610461576020601354604051908152f35b503461046157806003193601126104615760206001600160a01b0360025416604051908152f35b50346104615761206b36613e5c565b9061207a999299979697615699565b8342116123c557916121cf8794928996948b8d604051906001600160a01b03808060208501957f1605d38f16362508f9156040bddd3aeadb19a55923f0d909d03527e49490c0f48752169b8c6040860152169b8c606085015216978860808401528c60a08401528960c084015260e0830152610100820152610100815261210361012082613f41565b51902060405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f8f429a0fc873125e8129237a4b5743f5e65cbbd957afd3b84ba0680e8fe6b1db60408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815261219860c082613f41565b5190209060405190602082019261190160f01b845260228301526042820152604281526121c6606282613f41565b5190208c615c3a565b156123b6576121e08a878b8b6156b9565b9283116123a7576001600160a01b03600354168015610804576020602491604051928380926312dc51a560e31b82528760048301525afa90811561093b578291612388575b501561237957604051633b2a7c0560e21b8152336004820152602081602481865afa90811561093b57829161234a575b501561233c57509288927fecef7698217b345db7161a8d2ffa4e7109c3ca0fe6e64ca6627ee67be3e818fc86896122e060209d83976122b48f9b6122a361232d9f9e61231f9e309084615874565b8d6122ae8489614668565b9161577c565b60405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b0390a36040519586948986019889916080936001600160a01b03809298979693988160a087019a16865216602085015216604083015260608201520152565b03601f198101835282613f41565b51902060018055604051908152f35b6282b42960e81b8152600490fd5b61236c915060203d602011612372575b6123648183613f41565b810190614b1b565b5f612255565b503d61235a565b6367cc8b7560e01b8152600490fd5b6123a1915060203d602011612372576123648183613f41565b5f612225565b631fb915a760e31b8152600490fd5b63f9d36a7160e01b8152600490fd5b63241d197f60e11b8352600483fd5b50346104615780600319360112610461576123ed614eee565b806001600160a01b038154811981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461046157806003193601126104615760206001600160a01b0360035416604051908152f35b503461046157604036600319011261046157612467613dee565b90612470613e04565b612478614eee565b6001600160a01b0383169283151580612531575b612522576001600160a01b03821680151580612519575b611771577f92f63be5e4bfac76f996bbbee86c4933f30141307811e42d6977a697dd8fc3ec93946001600160a01b031960175416176017556001600160a01b03196018541617601855612513604051928392839092916001600160a01b0360209181604085019616845216910152565b0390a180f35b50823b156124a3565b63e6c4247b60e01b8352600483fd5b50803b1561248c565b5034610461576020366003190112610461576020610a4c612559613dee565b614b50565b5034610461578060031936011261046157604051633fabe5a360e21b815260a0816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa829083918185948693612764575b506125d05763b41b6cb160e01b8552600485fd5b6402540be40083128015612755575b612746576125ef60165442614668565b84106127465769ffffffffffffffffffff908116911681116127375769ffffffffffffffffffff906008606060405161262781613ed9565b858152866020820152836040820152015282600a5583600b551669ffffffffffffffffffff19600c541617600c55600c546aff00000000000000000000600860501b16906aff00000000000000000000191617600c5560125460ff8116806126f5575b50506013546126bb575b7fdb6fb3cf4cc5fb760bcd63b958a53b2396776dff32c063188e864296541e76bd8380a380f35b7fd1cdd29a2fc16e6ed81266a11c8f7f06897e72e22d1bb9ccf34d63c3583d5df360206014548560135585601455604051908152a1612694565b60407f5e5763e2a601dbb21ceae7f64e18f3d572378b373daa8d75a325f22f377f0ecb918151908152866020820152a160ff1916601255826015555f8061268a565b63b41b6cb160e01b8452600484fd5b63b41b6cb160e01b8552600485fd5b506509184e72a00083136125df565b925093505061278b915060a03d60a01161279a575b6127838183613f41565b810190614a8d565b9492915092909293915f6125bc565b503d612779565b50346104615760203660031901126104615760406020916001600160a01b036127c8613dee565b168152600883522054604051908152f35b5034610461576040366003190112610461576001600160a01b0360406127fd613dee565b9282612807613e04565b9416815260066020522091165f526020526040805f205460ff82519165ffffffffffff8116835260301c1615156020820152f35b503461046157806003193601126104615760206001600160a01b0360045416604051908152f35b50346104615780600319360112610461576020600f54604051908152f35b50346104615780600319360112610461576020604051610e108152f35b503461046157806003193601126104615760206001600160a01b03601d5416604051908152f35b5034610461576060366003190112610461576128de613dee565b60243567ffffffffffffffff8111610509576128fe903690600401613fd9565b9060443567ffffffffffffffff8111610fc55761291f903690600401613fd9565b90926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303612a4057818103612a315791936001600160a01b03169185805b828110612972575080f35b85857f272958aacfbf07577da4ede62cc7d612dfb0881c6489c961988ef59378d7709f60206001600160a01b03612a1d6129c8878b8f6129e4838e612a179360019f60408f918f926129c8878b6129cd93614b33565b614b43565b92815260068e52208b6129e96129e4878787614b33565b6141e5565b165f528c5260405f209066ff000000000000825491151560301b169066ff0000000000001916179055614b33565b98614b33565b9460405195151586521693a3018690612967565b63c52a9bd360e01b8652600486fd5b6282b42960e81b8652600486fd5b503461046157604036600319011261046157612a68613dee565b6001600160a01b03612a78613e04565b91612a81614eee565b168083526011602052604083206001600160a01b0383165f5260205260405f2054918215612af95760206001600160a01b037fe4ddb9696b79889a2b0002aa61f703666d072c319c0694d71624728605bdd2879284875260118352604087208282165f5283528660405f20556040519586521693a380f35b630342954b60e21b8452600484fd5b503461046157604036600319011261046157612b22613dee565b612b2a613e04565b612b326158b5565b604051632474521560e21b81527fe94d78b6d8fb99b2c21131eb4552924a60f564d8515a3cc90ef300fc9735c07460048201523360248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115612d85578491612d66575b50156117e6576001600160a01b03821680158015612d55575b612d46576001600160a01b03600354168015612d375760206024916040519283809263b8d7b66960e01b82523360048301525afa8015612d2c5782918691612ce0575b506001600160a01b031603612cd1577f823c9466affb5a8646bc5f7e6304f72a4622cc01af819ec2f51b1130a725c6d191612ccb913386526005602052604086209060018201906001600160a01b0319825416179055600281016001600160a01b0383166001600160a01b031982541617905570010000000000000000000000000000000070ff00000000000000000000000000000000198254161790556040519182913395839092916001600160a01b0360209181604085019616845216910152565b0390a280f35b6367cc8b7560e01b8452600484fd5b9150506020813d602011612d24575b81612cfc60209383613f41565b81010312610fc557516001600160a01b0381168103610fc55781906001600160a01b03612c07565b3d9150612cef565b6040513d87823e3d90fd5b63c52a9bd360e01b8552600485fd5b63c52a9bd360e01b8452600484fd5b506001600160a01b03821615612bc4565b612d7f915060203d602011612372576123648183613f41565b5f612bab565b6040513d86823e3d90fd5b50346104615780600319360112610461576020600954604051908152f35b5034610461576020366003190112610461576001600160a01b03612dd0613dee565b612dd8614eee565b1680156106fc57600354816001600160a01b0382167f05ba7ce38b27f49ba3b81247ac7a13b30021ce3e90f633a2498fa9d1a09579908580a36001600160a01b0319161760035580f35b503461046157806003193601126104615750611204604051612e45604082613f41565b601481527f53757065725061796d61737465722d352e332e330000000000000000000000006020820152604051918291602083526020830190613fb5565b50346104615760803660031901126104615760243560043560443567ffffffffffffffff8111611d3457612ebb903690600401613e2e565b505060643560ff8116809103611d34576001600160a01b03600e541633141580613105575b6130f757600b5483111561273757611c1f194201428111611a8457831061273757600f4201804211611a84578311612737576402540be400821280156130e8575b61273757604051633fabe5a360e21b815260a0816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80869287926130bf575b5061304c575b505060019060086060604051612f8981613ed9565b85815260208101879052604081018890520152600a839055600b849055600c80546affffffffffffffffffffff19166a0800000000000000000000179055148061303e575b612ff9577fdb6fb3cf4cc5fb760bcd63b958a53b2396776dff32c063188e864296541e76bd8380a380f35b6012547f5e5763e2a601dbb21ceae7f64e18f3d572378b373daa8d75a325f22f377f0ecb6040805160ff84168152866020820152a160ff191660125582601555612694565b5060ff601254161515612fce565b85821390816130a9575b50613062575b80612f74565b60149080841315613093578061308361307e6130889387614abf565b614ad7565b614aed565b13612737575f61305c565b8061308361307e866130a494614abf565b613088565b611c2091506130b89042614668565b105f613056565b9092506130db915060a03d60a01161279a576127838183613f41565b509392505091905f612f6e565b506509184e72a0008213612f21565b6282b42960e81b8452600484fd5b506001600160a01b03845416331415612ee0565b50346104615780600319360112610461576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036131845760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b63703e46dd60e11b8152600490fd5b5034610461576060366003190112610461576004359067ffffffffffffffff82116104615761012060031983360301126104615761323261321a836132026001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633146146b5565b61320a615699565b6044359060243590600401614711565b60018055604051928392604084526040840190613fb5565b9060208301520390f35b50604036600319011261046157613251613dee565b9060243567ffffffffffffffff8111611347573660238201121561134757613283903690602481600401359101613f7f565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001680301490811561345a575b5061344b576132c5614eee565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596613417575b5061330a57634c9c8ce360e01b84526004839052602484fd5b9091847f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81036134055750813b156133f357806001600160a01b03197f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a281518390156133d957808360206133d595519101845af46133cf615d3e565b91615d6d565b5080f35b505050346133e45780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011613443575b8161343360209383613f41565b81010312610fc55751945f6132f1565b3d9150613426565b63703e46dd60e11b8252600482fd5b90506001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f6132b8565b50346104615760203660031901126104615760ff60406020926004358152601b84522054166040519015158152f35b503461046157806003193601126104615760206001600160a01b0360185416604051908152f35b50346104615780600319360112610461576020601554604051908152f35b50346104615780600319360112610461576020601454604051908152f35b50346104615760403660031901126104615761353b613dee565b60243590613547615699565b613550816157bd565b613569826001600160a01b036002541630903390615874565b6001600160801b038211611d255760206001600160a01b037f06653c045d0a3144153a51ac6909baae43b8d5b67184cb74e988b72858727fe492169283855260058252604085206001600160801b036135c781841682845416614695565b166001600160801b03198254161790556135e381600f5461422c565b600f55604051908152a26001805580f35b503461046157602036600319011261046157600435613611615699565b3382526005602052806001600160801b03604084205416106136b8573382526005602052604082206001600160801b0361365081841682845416614675565b166001600160801b031982541617905561366c81600f54614668565b600f5561368581336001600160a01b036002541661577c565b6040519081527f4eea589c35918e3c4d8e0371a062a1d544e41d78fb522381678923b9cd6e6dfa60203392a26001805580f35b3382526005602052604082205463cf47918160e01b83526001600160801b0316600452602452604490fd5b5034610461576136f236613e5c565b95969890929193613701615699565b60405160208101906001600160a01b038c169687835260408201526040815261372b606082613f41565b5190209661373b88888c8c6156b9565b946001600160a01b038a1694853b15610fc5576101048c848796958c9a9998958e6001600160a01b0396604051998a98899763cf09299560e01b8952169e8f600489015230602489015260448801526064870152608486015260a485015260e060c48501528160e4850152848401378181018301859052601f01601f1916810103018183875af1801561093b57613814575b50509285927fecef7698217b345db7161a8d2ffa4e7109c3ca0fe6e64ca6627ee67be3e818fc86896122e061232d9a8760209f9b9861231f9b8d6122ae6122b49389614668565b61381f828092613f41565b61046157806137cd565b503461046157602036600319011261046157600435613846614eee565b6101f481116138895760407f9b6bf5a61deb3c460999ea46c3ff444018a6f424eb8807d5e7e7ca031461cb9891601954908060195582519182526020820152a180f35b6358d620b360e01b8252600482fd5b503461046157604036600319011261046157806138b3613dee565b6138bb614eee565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690813b15611156576001600160a01b036044849283604051958694859363040b850f60e31b855216600484015260243560248401525af1801561093b57610da55750f35b5034610461578060031936011261046157613942614eee565b610671614619565b503461046157604036600319011261046157613964613dee565b6001600160a01b03613974613e04565b9161397d614eee565b613985615699565b168083526011602052604083206001600160a01b0383165f5260205260405f2054918215612af9578184526011602052604084206001600160a01b0382165f526020528360405f2055813b15611d345760405163fa74542d60e01b81526001600160a01b0382166004820152602481018490528490818160448183885af1801561093b57613a4c575b505060206001600160a01b037f84b561bfeda3b329970b08af25d20086abe657da83a1dbd00fdfaad913e8cfed926040519586521693a36001805580f35b81613a5691613f41565b611d3457835f613a0e565b5034610461576040366003190112610461576004359067ffffffffffffffff8211610461576101206003198336030112610461576040613aa66024356004850161424d565b825191151582526020820152f35b5034610461576020366003190112610461576040610120916001600160a01b03613adc613dee565b1681526005602052208054906001810154906001600160a01b0360028201541665ffffffffffff600460038401549301549360ff604051966001600160801b0381168852818160801c161515602089015260881c16151560408701526001600160a01b038116606087015263ffffffff8160a01c16608087015260c01c1660a085015260c084015260e0830152610100820152f35b5034610461578060031936011261046157613b8a614eee565b6106716141a6565b503461046157606036600319011261046157613bac613dee565b6024359060038210156105095760443567ffffffffffffffff8111611d3457613bd9903690600401613e2e565b906001600160a01b03600e54163303613cdf577fa49f25e6b37dc7492af788d36761dc1b25f8fb6dcc448fb5637dc828725f0d88926080926001600160a01b0392879060018803613cad57613c4f9150848416895260056020526001600160801b03600a8160408c2054160416925b3691613f7f565b6020815191012090613c8a604051613c68604082613f41565b600d81526c088aca8408498a640a6d8c2e6d609b1b6020820152828986614f14565b613c97604051809861410f565b602087015260408601524260608601521692a280f35b60028814613cc0575b613c4f9192613c48565b8385168952600560205260408920546001600160801b03169150613cb6565b6282b42960e81b8552600485fd5b5034610461578060031936011261046157602060ff60125416604051908152f35b503461046157806003193601126104615760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50602036600319011261092f5760043563ffffffff811680910361092f57613d78614eee565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690813b1561092f575f90602460405180948193621cb65b60e51b8352600483015234905af18015613de357613dd5575080f35b613de191505f90613f41565b005b6040513d5f823e3d90fd5b600435906001600160a01b038216820361092f57565b602435906001600160a01b038216820361092f57565b35906001600160a01b038216820361092f57565b9181601f8401121561092f5782359167ffffffffffffffff831161092f576020838186019501011161092f57565b9061010060031983011261092f576004356001600160a01b038116810361092f57916024356001600160a01b038116810361092f57916044356001600160a01b038116810361092f5791606435916084359160a4359160c4359160e4359067ffffffffffffffff821161092f57613ed591600401613e2e565b9091565b6080810190811067ffffffffffffffff821117613ef557604052565b634e487b7160e01b5f52604160045260245ffd5b60a0810190811067ffffffffffffffff821117613ef557604052565b6040810190811067ffffffffffffffff821117613ef557604052565b90601f8019910116810190811067ffffffffffffffff821117613ef557604052565b67ffffffffffffffff8111613ef557601f01601f191660200190565b929192613f8b82613f63565b91613f996040519384613f41565b82948184528183011161092f578281602093845f960137010152565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9181601f8401121561092f5782359167ffffffffffffffff831161092f576020808501948460051b01011161092f57565b8054821015614023575f52600560205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b90600182811c92168015614065575b602083101461405157565b634e487b7160e01b5f52602260045260245ffd5b91607f1691614046565b9060405191825f82549261408284614037565b80845293600181169081156140ed57506001146140a9575b506140a792500383613f41565b565b90505f9291925260205f20905f915b8183106140d15750509060206140a7928201015f61409a565b60209193508060019154838589010152019101909184926140b8565b9050602092506140a794915060ff191682840152151560051b8201015f61409a565b90600382101561411c5752565b634e487b7160e01b5f52602160045260245ffd5b9061417490825181526020830151602082015260408301516040820152608080614169606086015160a0606086015260a0850190613fb5565b94015191019061410f565b90565b604090600319011261092f576004356001600160a01b038116810361092f5790602435801515810361092f5790565b601354156140a7577fd1cdd29a2fc16e6ed81266a11c8f7f06897e72e22d1bb9ccf34d63c3583d5df360206014545f6013555f601455604051908152a1565b356001600160a01b038116810361092f5790565b903590601e198136030182121561092f570180359067ffffffffffffffff821161092f5760200191813603831361092f57565b9190820180921161423957565b634e487b7160e01b5f52601160045260245ffd5b6001600160a01b0361425e82615372565b1691825f52600560205260405f209283549160ff8360801c16156145ee5760ff8360881c166145c357614293612559856141e5565b156145985760e084019160346142a984876141f9565b90501015614540575b5f52600660205260405f206001600160a01b036142ce866141e5565b165f5260205260405f20946020604051966142e888613f25565b549660ff65ffffffffffff89169889835260301c1615159182910152614524576001015465ffffffffffff8160c01c16801515968761451a575b87614505575b50505f1992606861433982886141f9565b905010156144e0575b506001600160a01b031691604051633ba0b9a960e01b8152602081600481875afa908115613de3575f916144ae575b501161448357600b54801590811561446d575b5061445357614392906153a3565b91600d5492836127100193846127101161423957612af801809411614239576001600160801b03936143c391615458565b9283911610614429576143d86143de936141e5565b90615471565b614402576143ed576001905f90565b5f906b1490551157d312535255115160a21b90565b505f907f4352454449545f4558434545444544000000000000000000000000000000000090565b505050505f907f494e53554646494349454e545f42414c414e434500000000000000000000000090565b505f946a5354414c455f505249434560a81b945092505050565b61447b91506016549061422c565b42115f614384565b50505050505f907f524154455f434f4d4d49544d454e545f56494f4c41544544000000000000000090565b90506020813d6020116144d8575b816144c960209383613f41565b8101031261092f57515f614371565b3d91506144bc565b6144ec919350856141f9565b60681161092f5760480135916001600160a01b03614342565b61451092975061422c565b4210945f80614328565b8015159750614322565b505f956b1554d15497d09313d0d2d15160a21b95509350505050565b61454a83866141f9565b60341161092f576001600160801b03602462030d4092013560801c1610156142b2575050505050505f907f504f53544f505f4741535f544f4f5f4c4f57000000000000000000000000000090565b50505050505f907f555345525f4e4f545f454c494749424c4500000000000000000000000000000090565b50505050505f907f4f50455241544f525f504155534544000000000000000000000000000000000090565b50505050505f907f4f50455241544f525f4e4f545f434f4e4649475552454400000000000000000090565b601d546001600160a01b038116908115614664576001600160a01b031916601d555f601e557fde82ad51cc1336e141528846e966b9e7f7ae89a78ebb71d1f0da0d851592d8ee5f80a2565b5050565b9190820391821161423957565b906001600160801b03809116911603906001600160801b03821161423957565b906001600160801b03809116911601906001600160801b03821161423957565b156146bc57565b60405162461bcd60e51b815260206004820152602760248201527f426173655061796d61737465723a2063616c6c6572206973206e6f7420456e746044820152661c9e541bda5b9d60ca1b6064820152608490fd5b92916001600160a01b0361472485615372565b16805f52600560205260405f209283549260ff8460801c1615614a6157614750600b546016549061422c565b945f9460ff8160881c16614a4a5761476a6125598a6141e5565b15614a4a5760e08901926034614780858c6141f9565b90501015614a06575b855f52600660205260405f206001600160a01b036147a68c6141e5565b165f5260205260405f2060ff604051916147bf83613f25565b5465ffffffffffff8116835260301c16151580602083015261496a579083929160018c9695019485549165ffffffffffff8360c01c1690816149da575b5050606861480c825f19996141f9565b905010156149b5575b506001600160a01b031694604051633ba0b9a960e01b81526020816004818a5afa908115613de3575f91614983575b501161496a57614853906153a3565b600d5490816127100191826127101161423957612af801809211614239576148899161487e91615458565b80956143d88d6141e5565b614949576001600160801b0316838110614949576001600160a01b039260036148f7936001600160801b036148c28795828a1690614675565b166001600160801b0319825416178155016148de86825461422c565b90556148ec8560105461422c565b6010555416986141e5565b6040519860208a01521660408801526060870152608086015260a085015260a0845261492460c085613f41565b60a09190911b65ffffffffffff60a01b1660d09190911b6001600160d01b0319161790565b50505050505050509050604051614961602082613f41565b5f815290600190565b5050505050505050509050604051614961602082613f41565b90506020813d6020116149ad575b8161499e60209383613f41565b8101031261092f57515f614844565b3d9150614991565b6149c19196508c6141f9565b60681161092f5760480135946001600160a01b03614815565b5165ffffffffffff1680156147fc57919a5001955065ffffffffffff8611614239578b95985f806147fc565b614a10848b6141f9565b60341161092f576001600160801b03602462030d4092013560801c1610156147895750505050505050509050604051614961602082613f41565b505050505050509050604051614961602082613f41565b50505050509050604051614961602082613f41565b519069ffffffffffffffffffff8216820361092f57565b908160a091031261092f57614aa181614a76565b91602082015191604081015191614174608060608401519301614a76565b81810392915f13801582851316918412161761423957565b9060648202918083056064149015171561423957565b8115614b0757600160ff1b81145f19831416614239570590565b634e487b7160e01b5f52601260045260245ffd5b9081602091031261092f5751801515810361092f5790565b91908110156140235760051b0190565b35801515810361092f5790565b6001600160a01b0381165f52600760205260ff60405f205416908115614b74575090565b6141749150614e7b565b916001600160a01b0360405192816020850195168552166040830152606082015260608152614bae608082613f41565b51902090565b8181029291811591840414171561423957565b91908015614df9578260a0918101031261092f57614be482613e1a565b91614bf160208201613e1a565b6040820135906001600160a01b038080614c12608060608801359701613e1a565b97169216951693845f52600560205265ffffffffffff600160405f20015460c01c16614dbc575b835f52602160205260ff60405f205416614db457835f52602160205260405f20600160ff19825416179055845f526005602052600460405f2001908154915f198314614239576001614c8d930190556153a3565b92600d5461271001806127101161423957614cab6127109186614bb4565b049280841015614da5577fcde7e91a718e2439d8ff2a679ad52713e82a37b72622fb530c8c41039fdd5bf094928492614ce9604096614d4d94614668565b906001600160801b038211614d96575b848a6010548b818611614d5d575b5050614d139394615972565b865f526005602052845f206001600160801b03614d3581841682845416614695565b166001600160801b0319825416179055601054614668565b60105582519182526020820152a3565b7f418c06850785ce4239177091a96c1757ba1d5ba22df98a4cf818e1510fa028cd8b614d13978151908152846020820152a2938b614d07565b6001600160801b039150614cf9565b935093506140a7949150615972565b505050505050565b845f52600660205260405f206001600160a01b0387165f5260205260405f2065ffffffffffff8042161665ffffffffffff19825416179055614c39565b505050565b600b548015614e1f57614e1b65ffffffffffff916016549061422c565b1690565b505f90565b600382101561411c5752565b906140a7604051614e4081613f09565b608060ff60048396805485526001810154602086015260028101546040860152614e6c6003820161406f565b60608601520154169101614e24565b6001600160a01b0360175416908115614ee8576001600160a01b036024602092604051948593849263710d9c6960e11b84521660048301525afa5f9181614ec7575b5061417457505f90565b614ee191925060203d602011612372576123648183613f41565b905f614ebd565b50505f90565b6001600160a01b035f54163303614f0157565b63118cdaa760e01b5f523360045260245ffd5b6001600160a01b0390939192931692835f52600560205260405f2060038410158061411c57846153565760ff600a5b169061411c5760028514615324575b60ff825460881c166152fa575b60018201918163ffffffff845460a01c16115f146152e7578163ffffffff845460a01c160363ffffffff811161423957835463ffffffff60a01b191660a09190911b63ffffffff60a01b161783555b836151e7575b50855f52600860205260405f209360405191614fcf83613f09565b4283526020830185815260408401918252606084019283526080840196614ff68989614e24565b805468010000000000000000811015613ef5576150189160018201815561400a565b9490946151d457518455516001840155516002830155518051600383019167ffffffffffffffff8211613ef55761504f8354614037565b601f8111615183575b50602090601f831160011461511c576004949392915f9183615111575b50508160011b915f199060031b1c19161790555b019251600381101561411c577fa7503227727e36abb7f0ecf24f626347ccc20233c48c554d49d7d2077a1a3040604063ffffffff946151027ffc577563f1b9a0461e24abef1e1fcc0d33d3d881f20b5df6dda59de4aae2c821986020988b9660ff8019835416911617905583519283528883019061410f565ba25460a01c16604051908152a2565b015190505f80615075565b90601f19831691845f52815f20925f5b81811061516b575091600193918560049897969410615153575b505050811b019055615089565b01515f1960f88460031b161c191690555f8080615146565b9293602060018192878601518155019501930161512c565b8281111561505857835f5260205f20601f840160051c90602085106151cc575b81601f9101920160051c03905f5b8281106151bf575050615058565b5f828201556001016151b1565b5f91506151a3565b634e487b7160e01b5f525f60045260245ffd5b6001600160801b03815416610bb8810290808204610bb8149015171561423957612710900480851161528b575b5080546001600160801b031684811061526557506001600160801b0361523f81861682845416614675565b166001600160801b031982541617905561525b8360105461422c565b6010555b5f614fb4565b9193506001600160801b031981541690556152828160105461422c565b6010559161525f565b6020919594506010826152e092966040519481869251918291018484015e81017f2028436170706564206174203330252900000000000000000000000000000000838201520301600f19810184520182613f41565b935f615214565b825463ffffffff60a01b19168355614fae565b857fc5437eb8dd091f69800961953f2bb0bc16ae1ff2d3e52caa96796db65f8271da5f80a2614f5f565b815471ff0000000000000000000000000000000000191671010000000000000000000000000000000000178255614f52565b505f600185036153695760ff6014614f43565b60ff6032614f43565b60e08101604861538282846141f9565b905010614ee857615392916141f9565b60481161092f576034013560601c90565b604051906153b082613ed9565b600a5490818352600b54602084015260ff6060600c549469ffffffffffffffffffff86166040820152019360501c1683525f8213156154495760ff916153f591614bb4565b915116604d81116142395760095461540f91600a0a614bb4565b61542281670de0b6b3a764000084615b39565b918115614b0757670de0b6b3a7640000900961543b5790565b600181018091116142395790565b63b41b6cb160e01b5f5260045ffd5b9061271090615468828285615b39565b920961543b5790565b604051633ba0b9a960e01b815291926001600160a01b039190911691602081600481865afa908115613de3575f91615667575b50670de0b6b3a76400006154b9818385615b39565b918309615647575b6001600160a01b03604051946370a0823160e01b86521693846004820152602081602481875afa908115613de3575f91615615575b50101561560e57604051634d3c739760e11b815260048101849052602081602481865afa908115613de3575f916155da575b5061554d90615552935f52601160205260405f20855f5260205260405f20549061422c565b61422c565b60405191632c333e2560e01b835260048301526020826024816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa918215613de3575f926155a957501190565b9091506020813d6020116155d2575b816155c560209383613f41565b8101031261092f57511090565b3d91506155b8565b90506020813d602011615606575b816155f560209383613f41565b8101031261092f5751615552615528565b3d91506155e8565b5050505f90565b90506020813d60201161563f575b8161563060209383613f41565b8101031261092f57515f6154f6565b3d9150615623565b60018101809111156154c157634e487b7160e01b5f52601160045260245ffd5b90506020813d602011615691575b8161568260209383613f41565b8101031261092f57515f6154a4565b3d9150615675565b6002600154146156aa576002600155565b633ee5aeb560e01b5f5260045ffd5b93926156c36158b5565b805f52601b60205260ff60405f20541661576e576156e19185614b7e565b805f52601b60205260ff60405f20541661576e576127109161572c915f52601b60205260405f20600160ff19825416179055335f52601a60205260405f205490811561576457614bb4565b0491826157365750565b335f52601c6020526001600160a01b0360405f2091165f5260205260405f2061576083825461422c565b9055565b6019549150614bb4565b623f613760e71b5f5260045ffd5b60405163a9059cbb60e01b60208201526001600160a01b039290921660248301526044808301939093529181526140a7916157b8606483613f41565b615bce565b6001600160a01b0360405191632474521560e21b83527f2024516755f401845808190bb830b0e4523d0df0845503cab52130a794699a0f60048401521660248201526020816044816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa908115613de3575f91615855575b501561584757565b6282b42960e81b5f5260045ffd5b61586e915060203d602011612372576123648183613f41565b5f61583f565b9091926001600160a01b036140a79481604051956323b872dd60e01b60208801521660248601521660448401526064830152606482526157b8608483613f41565b604051632474521560e21b81527f2024516755f401845808190bb830b0e4523d0df0845503cab52130a794699a0f60048201523360248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115613de3575f9161585557501561584757565b6001600160a01b03805f549216918282198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6001600160a01b0390939192931691823b1561092f57604051635c1d516f60e11b81526001600160a01b038216600482015260248101859052604481018390525f9290838160648183895af19081615a8f575b50615a8857833b15610509576040516330f5344160e01b81526001600160a01b038316600482015260248101869052604481019190915282808260648183895af19182615a73575b5050615a6d576001600160a01b03602091604084867f8d05946ad7acf1695cdb2c1c7b76b11a907b33e5224f086eea17d6a23841e17f965260118552208282165f52835260405f20615a6087825461422c565b90556040519586521693a3565b50505050565b81615a7d91613f41565b61050957825f615a0d565b5050505050565b615a9c9194505f90613f41565b5f925f6159c5565b604051633fabe5a360e21b815260a0816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa5f9181615b13575b50615af65750600190565b8015615b0d57610e10810180911161423957421190565b50600190565b615b2d91925060a03d60a01161279a576127838183613f41565b5092505050905f615aeb565b9091828202915f1984820993838086109503948086039514615bc05784831115615bb157829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b63227bc15360e01b5f5260045ffd5b505091508115614b07570490565b5f806001600160a01b03615bf793169360208151910182865af1615bf0615d3e565b9083615d6d565b8051908115159182615c1f575b5050615c0d5750565b635274afe760e01b5f5260045260245ffd5b615c329250602080918301019101614b1b565b155f80615c04565b90919392935f906001600160a01b03831615615d35576040519160048301602484019560448501916064860193873b15615ca45750936064938a80948a9b9c9460209b9a9998630b135d3f60e11b8a525260408a52523701915afa9051630b135d3f60e11b141690565b999350509395505080604014615cf157604114615cc15750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9192939550602081013590601b8260ff1c016020523560405216606052615cd4565b505f9450505050565b3d15615d68573d90615d4f82613f63565b91615d5d6040519384613f41565b82523d5f602084013e565b606090565b90615d915750805115615d8257805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580615dbe575b615da2575090565b6001600160a01b0390639996b31560e01b5f521660045260245ffd5b50803b15615d9a56fef0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a2646970667358221220ba7a9c9b51b6c1786b6058267032b661e1b5da6dcfae4727c94baa589443154564736f6c63430008210033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00" + "bytecode": "0x6101003461029257601f61612a38819003918201601f19168301916001600160401b03831184841017610296578084926060946040528339810103126102925780516001600160a01b0381169190828103610292576020820151916001600160a01b038316830361029257604001516001600160a01b038116939084900361029257331561027f575f8054336001600160a01b0319821681178355604051939290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a33060805215610248575060a0525f51602061610a5f395f51905f525460ff8160401c16610239576002600160401b03196001600160401b038216016101e3575b506001805566470de4df8200006009556103e8600d5560c05260e052604051615e5f90816102ab823960805181818161328d01526133e6015260a051818181610d520152818161104c015281816110fa0152818161138d01528181611620015281816120350152818161333401528181613a1e0152613dc4015260c0518181816108760152818161179a01528181612a8401528181612ccc01528181613d70015281816155b7015281816158510152615938015260e0518181816115dc015281816126dd015281816130930152615afb0152f35b6001600160401b0319166001600160401b039081175f51602061610a5f395f51905f52556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f61010f565b63f92ee8a960e01b5f5260045ffd5b62461bcd60e51b8152602060048201526012602482015271125b9d985b1a5908115b9d1c9e541bda5b9d60721b6044820152606490fd5b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f5f3560e01c80630396cb6014613d9457806306433b1b14613d505780630761581514613d2f578063079d2d4214613bd45780630c88311214613bb357806313e7c9d814613af657806317a1877814613aa35780631d2282c914613a82578063205c2878146139f15780632540c471146139825780632608c9e61461383c5780632e1a7d4d1461374d5780632f4f21e21461367a57806334fde76a1461365c5780633d63f2151461363e5780634382885d146136175780634ee1a3d6146135e85780634f1ef2861461339557806352b7512c146132ec57806352d1902d1461327257806353afb8be14612fdc57806354fd4d5014612f7b57806358a2570a14612f07578063594a6f2314612ee95780635c7c4b5f14612c615780635d2e7e5014612ba75780635f4cd4fe14612a1d57806360a9139b146129f657806360d7442b146129d957806361ad446e146129bb57806361d027b3146129945780636640431f1461293257806366c36875146128fa578063673a7e28146126b75780636a16e22d146126935780636a4b23b1146125a65780636d8a4aff1461257f578063715018a61461252d5780637344209c146121b557806374f053c41461218e57806375e09b5114612170578063761cda3314612140578063787dce3d146120e05780637af3816c146120c25780637b707185146120745780637c627b2114611fe85780638041c94a14611e8f57806382309dd814611e6457806384450c3d14611d835780638670d78d14611d3857806388a7ca5c14611c1f5780638da5cb5b14611bf95780638e0d8ed914611bde5780638e58021314611b41578063928624e714611b0957806396daa32214611aeb57806396ea1e3814611991578063a0c5018b146118f7578063a134d63a146117f4578063a3970ae614611780578063a4b5328f1461168d578063ad3cb1cc14611644578063b0d691fe14611600578063b0f0abe9146115bc578063b54a8fca1461150b578063b6b55f251461143b578063b7b76cbe14611415578063bac256d6146113f7578063bb2ddb27146113d9578063bb9fe6bf14611369578063bd1118701461134b578063bfa5a1eb14611252578063c06f58e81461122b578063c1d9cb081461115a578063c23a5cea146110cd578063c399ec881461101f578063c50cff8714610fc9578063cf756fdf14610db9578063d0e30db014610d33578063d20727d714610c9d578063d4c38f5214610bd8578063dc61ae9014610a9b578063ddd595ca14610a7d578063de5c62a614610a56578063e21b38d214610a28578063e8ade1a91461098c578063eafe74b514610825578063ec2123f114610759578063ef842a461461070b578063f0f4426014610688578063f2fde38b14610637578063f5c91a0814610591578063f60fdcb31461054a578063f7e8cb0d1461050d578063fc347007146104645763fe719e2f1461043a575f80fd5b34610461578060031936011261046157602065ffffffffffff815460a01c16604051908152f35b80fd5b50346104615760203660031901126104615760043565ffffffffffff811690818103610509576104926158f7565b338352600560205260016040842001907fffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff82549165ffffffffffff60c01b9060c01b1691161790556040519081527f4419a541734858dec04cd4ea31aff7b399a0b82dc61f30cc777c1907dc8102ed60203392a280f35b8280fd5b50346104615760203660031901126104615760ff60406020926001600160a01b03610536613e30565b168152600784522054166040519015158152f35b50346104615780600319360112610461576080600a5460ff600b54600c5490604051938452602084015269ffffffffffffffffffff8116604084015260501c166060820152f35b5034610461576040366003190112610461576105ab613e30565b602435906105b7614f30565b63ffffffff8211610628576001600160a01b03168083526005602090815260408420600101805463ffffffff60a01b191660a085901b63ffffffff60a01b1617905590917ffc577563f1b9a0461e24abef1e1fcc0d33d3d881f20b5df6dda59de4aae2c8219190604051908152a280f35b634163383f60e11b8352600483fd5b503461046157602036600319011261046157610651613e30565b610659614f30565b6001600160a01b038116156106745761067190615977565b80f35b631e4fbdf760e01b82526004829052602482fd5b5034610461576020366003190112610461576001600160a01b036106aa613e30565b6106b2614f30565b1680156106fc57600454816001600160a01b0382167f4ab5be82436d353e61ca18726e984e561f5c1cc7c6d38b29d2553c790434705a8580a36001600160a01b0319161760045580f35b63e6c4247b60e01b8252600482fd5b5034610461576040366003190112610461576001600160a01b03604061072f613e30565b9282610739613e46565b94168152601c6020522091165f52602052602060405f2054604051908152f35b503461046157602036600319011261046157600435610776614f30565b66038d7ea4c6800081108015610813575b6108045760095490816107cc575b7ffcc60d1b1dedb59d33b8eef97db5a70c8f8f8523c70d6a027dbf676f1290f8d2918160409260095582519182526020820152a180f35b612710612328830204811080156107f3575b15610795575b63c52a9bd360e01b8352600483fd5b50612710612af883020481116107de565b63c52a9bd360e01b8252600482fd5b50683635c9adc5dea000008111610787565b50346104615760403660031901126104615761083f613e30565b90610848613e46565b916001600160a01b0360405191632c333e2560e01b8352168060048301526020826024816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa918215610981578392610946575b506001600160a01b039360246020926040519687938492634d3c739760e11b84526004840152165afa90811561093b578291610902575b60209350818111156108fb576108f392506146aa565b604051908152f35b50506108f3565b90506020833d602011610933575b8161091d60209383613f83565b8101031261092f5760209251906108dd565b5f80fd5b3d9150610910565b6040513d84823e3d90fd5b9091506020813d602011610979575b8161096260209383613f83565b8101031261092f5751906001600160a01b036108a6565b3d9150610955565b6040513d85823e3d90fd5b5034610461576001600160a01b036109a3366141b9565b91906109ad614f30565b1690818352600560205260408320805460ff60881b83151560881b169060ff60881b19161790555f14610a01577fc5437eb8dd091f69800961953f2bb0bc16ae1ff2d3e52caa96796db65f8271da8280a280f35b7fae02c1bd695006b6d891af37fdeefea45a10ebcc17071e3471787db4f17728858280a280f35b5034610461576020366003190112610461576020610a4c610a47613e30565b614ebd565b6040519015158152f35b503461046157806003193601126104615760206001600160a01b0360175416604051908152f35b5034610461578060031936011261046157602060405162093a808152f35b50346104615780600319360112610461576013548015610bc957610e108101809111610bb5574210610ba65760145480600a5542600b556a08000000000000000000006affffffffffffffffffffff19600c541617600c5560125460ff81169060018203610b61575b505081601355816014557ffb96594f297e98363f469f68dba1862f6b4e6dbe060a9fd971f41087b2bb21066020604051838152a142907fdb6fb3cf4cc5fb760bcd63b958a53b2396776dff32c063188e864296541e76bd8380a380f35b7f5e5763e2a601dbb21ceae7f64e18f3d572378b373daa8d75a325f22f377f0ecb60406001938151908152846020820152a160ff191617601255426015555f80610b04565b63174b336d60e21b8152600490fd5b634e487b7160e01b82526011600452602482fd5b63a24a147160e01b8252600482fd5b503461046157602036600319011261046157610bf2613e30565b610bfa6156db565b338252601c602052604082206001600160a01b0382165f5260205260405f2054908115610c84576001600160a01b0390338452601c602052604084208282165f526020528360405f20551690610c518133846157be565b6040519081527fdd3840d6dd5c33bfa3b3743f47978de59805ce10f5170e1659be2936e489d73e60203392a36001805580f35b63cf47918160e01b835260048390526001602452604483fd5b5034610461576020366003190112610461576001600160a01b03610cbf613e30565b610cc7614f30565b1680156106fc57806001600160a01b0319601d541617601d5562093a804201804211610d1f576020817f98f60c65a2b39c6b97ac2ab59944af0f43d99c0d1756339e5c607fd64341971c92601e55604051908152a280f35b634e487b7160e01b83526011600452602483fd5b508060031936011261046157610d47614f30565b806001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803b15610db657816024916040519283809263b760faf960e01b825230600483015234905af1801561093b57610da55750f35b81610daf91613f83565b6104615780f35b50fd5b503461046157608036600319011261046157610dd3613e30565b610ddb613e46565b906044356001600160a01b03811691828203610fc557606435925f516020615e0a5f395f51905f52549460ff8660401c16159567ffffffffffffffff811680159081610fbd575b6001149081610fb3575b159081610faa575b50610f9b5767ffffffffffffffff1981166001175f516020615e0a5f395f51905f525586610f6f575b506001600160a01b03831615610f605760ff5f516020615e0a5f395f51905f525460401c1615610f5157906001600160a01b038392610e9d829695615977565b168419600254161760025515155f14610f4a57505b166001600160a01b031960045416176004558015155f14610f41575b60165566470de4df8200006009556103e8600d55610ee95780f35b68ff0000000000000000195f516020615e0a5f395f51905f5254165f516020615e0a5f395f51905f52557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b50610e10610ece565b9050610eb2565b631afcd79f60e31b8752600487fd5b6349e27cff60e01b8752600487fd5b68ffffffffffffffffff191668010000000000000001175f516020615e0a5f395f51905f52555f610e5d565b63f92ee8a960e01b8852600488fd5b9050155f610e34565b303b159150610e2c565b889150610e22565b8480fd5b503461046157604036600319011261046157610fe3613e30565b60243590610fef614f30565b6101f48211611010576001600160a01b03168252601a602052604082205580f35b6358d620b360e01b8352600483fd5b50346104615780600319360112610461576040516370a0823160e01b8152306004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156110c1579061108e575b602090604051908152f35b506020813d6020116110b9575b816110a860209383613f83565b8101031261092f5760209051611083565b3d915061109b565b604051903d90823e3d90fd5b503461046157602036600319011261046157806110e8613e30565b6110f0614f30565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690813b15611156576001600160a01b036024849283604051958694859363611d2e7560e11b85521660048401525af1801561093b57610da55750f35b5050fd5b5034610461576020366003190112610461576001600160a01b0361117c613e30565b82608060405161118b81613f4b565b828152826020820152826040820152606080820152015216808252600860205260408220541561121c5780825260086020526040822090825260086020526040822054915f198301928311611208576112046111f06111ea858561404c565b50614e72565b604051918291602083526020830190614172565b0390f35b634e487b7160e01b81526011600452602490fd5b63e0a1dc3160e01b8252600482fd5b503461046157806003193601126104615760206001600160a01b03600e5416604051908152f35b50346104615760803660031901126104615761126c613e30565b9060243560038110156113475760643567ffffffffffffffff811161050957611299903690600401613e70565b6112a4949194614f30565b65ffffffffffff42166001600160a01b03831690818652601f60205265ffffffffffff60408720541681106113385762015180019065ffffffffffff8211611324579185969161131a936106719752601f60205265ffffffffffff60408920911665ffffffffffff198254161790553691613fc1565b9160443591614f56565b634e487b7160e01b86526011600452602486fd5b63be3963ef60e01b8652600486fd5b5080fd5b50346104615780600319360112610461576020601654604051908152f35b5034610461578060031936011261046157611382614f30565b806001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803b15610db65781809160046040518094819363bb9fe6bf60e01b83525af1801561093b57610da55750f35b50346104615780600319360112610461576020601e54604051908152f35b50346104615780600319360112610461576020601954604051908152f35b503461046157806003193601126104615760206001600160a01b03815416604051908152f35b5034610461576020366003190112610461576004356114586156db565b6114606158f7565b611479816001600160a01b0360025416309033906158b6565b6001600160801b0381116114fc573382526005602052604082206001600160801b036114aa818416828454166146d7565b166001600160801b03198254161790556114c681600f5461426e565b600f556040519081527f06653c045d0a3144153a51ac6909baae43b8d5b67184cb74e988b72858727fe460203392a26001805580f35b6354ada05560e01b8252600482fd5b5034610461576020366003190112610461576001600160a01b0361152d613e30565b611535614f30565b1680156106fc576020546201518042018042116115a8576001600160d01b0319909116821760a091821b65ffffffffffff60a01b161760208181556040519190921c65ffffffffffff1681527f0b969f7dbdbaad518bf93d6f72458e8fd633fe345297219a90f56b035d14468d9190a280f35b634e487b7160e01b84526011600452602484fd5b503461046157806003193601126104615760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461046157806003193601126104615760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461046157806003193601126104615750611204604051611667604082613f83565b60058152640352e302e360dc1b6020820152604051918291602083526020830190613ff7565b5034610461576040366003190112610461576116a7613e30565b6024356116b2614f30565b6116ba6156db565b6001600160a01b0382169182156117715760105467016345785d8a000081111561176b5767016345785d89ffff198101818111611324575b831161175c579161174e8160209361172b827ff7595c4fd7fa675e456dd9520ac8266c06d237d52900fc573bccc85b7c177c9e976146aa565b60105561173a82600f546146aa565b600f556001600160a01b03600254166157be565b604051908152a26001805580f35b63b4aa806360e01b8552600485fd5b846116f2565b63e6c4247b60e01b8452600484fd5b50346104615761178f366141b9565b906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036117e6576001600160a01b031682526007602052604082209060ff80198354169115151617905580f35b6282b42960e81b8352600483fd5b5034610461576020366003190112610461576001600160a01b03611816613e30565b168152600860205260408120805467ffffffffffffffff81116118e3576040519061184760208260051b0183613f83565b80825260208201809385526020852085915b8383106118c557868587604051928392602084019060208552518091526040840160408260051b8601019392905b82821061189657505050500390f35b919360019193955060206118b58192603f198a82030186528851614172565b9601920192018594939192611887565b600560206001926118d585614e72565b815201920192019190611859565b634e487b7160e01b83526041600452602483fd5b5034610461578060031936011261046157611910614f30565b6020546001600160a01b0381169081156107e45765ffffffffffff8160a01c1665ffffffffffff4216106107e457600e80546001600160a01b0319811684179091556001600160d01b03199091166020556001600160a01b03167f019f532f6e08ee8944dc2e7ac40f3c97ad4a20618aee847ddf7c502821c7dad48380a380f35b5034610461576020366003190112610461576004356119ae614f30565b81811315611adc576119be615ae6565b15611acd576015548015159081611ab6575b50611aa757600a5482811315611a9857611f40810290801591818105611f4014831715611a8457612710900591612ee08202918205612ee01417156115a8576127109005908212908115611a7a575b50611a6b578060145542601355610e104201804211610d1f577f028dfa1d2bc951d60682384a066c9424c3829ea5f25cb00a5f659caed927faea9160409182519182526020820152a180f35b636b04933560e01b8252600482fd5b905081135f611a1f565b634e487b7160e01b85526011600452602485fd5b63b41b6cb160e01b8352600483fd5b6304a1a56160e41b8252600482fd5b905062093a808101809111610d1f5742115f6119d0565b6304efd15560e41b8252600482fd5b63b41b6cb160e01b8252600482fd5b50346104615780600319360112610461576020600d54604051908152f35b50346104615760203660031901126104615760406020916001600160a01b03611b30613e30565b168152601a83522054604051908152f35b503461046157604036600319011261046157611b5b613e30565b6001600160a01b0360243591168252600860205260408220805482101561050957611b86925061404c565b508054600182015491611204611bd360028301549260ff6004611bab600384016140b1565b920154169360405196879687526020870152604086015260a0606086015260a0850190613ff7565b916080840190614151565b50346104615780600319360112610461576020610a4c615ae6565b50346104615780600319360112610461576001600160a01b036020915416604051908152f35b503461046157608036600319011261046157611c39613e30565b50611c42613e46565b6044359060643567ffffffffffffffff8111611d3457611c66903690600401613e70565b5050611c706156db565b6001600160a01b036002541633036117e657611c8b816157ff565b6001600160801b038211611d25577f06653c045d0a3144153a51ac6909baae43b8d5b67184cb74e988b72858727fe49160406001600160a01b03602093169485815260058452206001600160801b03611ce9818416828454166146d7565b166001600160801b0319825416179055611d0581600f5461426e565b600f55604051908152a260018055604051632229f29760e21b8152602090f35b6354ada05560e01b8352600483fd5b8380fd5b5034610461576020366003190112610461576001600160a01b03611d5a613e30565b168152601a60205260409020548015611d7857602090604051908152f35b5060206019546108f3565b5034610461578060031936011261046157611d9c614f30565b601d546001600160a01b0381169081156107e457601e5442106107e457600f5460105480911490811591611e52575b506107e45760025490826001600160a01b038316926001600160a01b031916176002556001600160a01b031916601d5582601e5581817fbbb759660e3239a80c3b3a0326287b69c8a5388b2ba43876c6b91c7c85f21fb86020604051428152a37f75f4cc3f3f70100dc11e396f47f8af2dec5cf7ec94e06062222be779cf2f3dec8380a380f35b67016345785d8a00009150115f611dcb565b50346104615780600319360112610461576020611e7f614e40565b65ffffffffffff60405191168152f35b503461046157606036600319011261046157611ea9613e30565b611eb1613e46565b60443590611ebd614f30565b611ec56156db565b6001600160a01b03829316918285526011602052604085206001600160a01b0383165f5260205260405f2054908115611fd957818115918215611fcf575b5050611fc7575b83611f14916146aa565b8285526011602052604085206001600160a01b0383165f5260205260405f2055813b15611d345760405163fa74542d60e01b81526001600160a01b0382166004820152602481018490528490818160448183885af1801561093b57611fb2575b505060206001600160a01b037f84b561bfeda3b329970b08af25d20086abe657da83a1dbd00fdfaad913e8cfed926040519586521693a36001805580f35b81611fbc91613f83565b611d3457835f611f74565b925082611f0a565b119050815f611f03565b630342954b60e21b8652600486fd5b503461046157608036600319011261046157600360043510156104615760243567ffffffffffffffff81116113475761202861206d913690600401613e70565b61205c6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633146146f7565b6120646156db565b60443591614c09565b6001805580f35b5034610461576040366003190112610461576001600160a01b036040612098613e30565b92826120a2613e46565b9416815260116020522091165f52602052602060405f2054604051908152f35b50346104615780600319360112610461576020601054604051908152f35b5034610461576020366003190112610461576004356120fd614f30565b6107d081116108045760407fb404cac19fb1cbeff98d325795b08886e3cd8fe8cb1a2f193aac66f13fb239c391600d549080600d5582519182526020820152a180f35b50346104615760603660031901126104615760206108f361215f613e30565b612167613e46565b60443591614bc0565b50346104615780600319360112610461576020601354604051908152f35b503461046157806003193601126104615760206001600160a01b0360025416604051908152f35b5034610461576121c436613e9e565b906121d39992999796976156db565b83421161251e57916123288794928996948b8d604051906001600160a01b03808060208501957f1605d38f16362508f9156040bddd3aeadb19a55923f0d909d03527e49490c0f48752169b8c6040860152169b8c606085015216978860808401528c60a08401528960c084015260e0830152610100820152610100815261225c61012082613f83565b51902060405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f8f429a0fc873125e8129237a4b5743f5e65cbbd957afd3b84ba0680e8fe6b1db60408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a081526122f160c082613f83565b5190209060405190602082019261190160f01b8452602283015260428201526042815261231f606282613f83565b5190208c615c7c565b1561250f576123398a878b8b6156fb565b928311612500576001600160a01b03600354168015610804576020602491604051928380926312dc51a560e31b82528760048301525afa90811561093b5782916124e1575b50156124d257604051633b2a7c0560e21b8152336004820152602081602481865afa90811561093b5782916124a3575b501561249557509288927fecef7698217b345db7161a8d2ffa4e7109c3ca0fe6e64ca6627ee67be3e818fc868961243960209d839761240d8f9b6123fc6124869f9e6124789e3090846158b6565b8d61240784896146aa565b916157be565b60405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b0390a36040519586948986019889916080936001600160a01b03809298979693988160a087019a16865216602085015216604083015260608201520152565b03601f198101835282613f83565b51902060018055604051908152f35b6282b42960e81b8152600490fd5b6124c5915060203d6020116124cb575b6124bd8183613f83565b810190614b5d565b5f6123ae565b503d6124b3565b6367cc8b7560e01b8152600490fd5b6124fa915060203d6020116124cb576124bd8183613f83565b5f61237e565b631fb915a760e31b8152600490fd5b63f9d36a7160e01b8152600490fd5b63241d197f60e11b8352600483fd5b5034610461578060031936011261046157612546614f30565b806001600160a01b038154811981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461046157806003193601126104615760206001600160a01b0360035416604051908152f35b5034610461576040366003190112610461576125c0613e30565b906125c9613e46565b6125d1614f30565b6001600160a01b038316928315158061268a575b61267b576001600160a01b03821680151580612672575b611771577f92f63be5e4bfac76f996bbbee86c4933f30141307811e42d6977a697dd8fc3ec93946001600160a01b031960175416176017556001600160a01b0319601854161760185561266c604051928392839092916001600160a01b0360209181604085019616845216910152565b0390a180f35b50823b156125fc565b63e6c4247b60e01b8352600483fd5b50803b156125e5565b5034610461576020366003190112610461576020610a4c6126b2613e30565b614b92565b5034610461578060031936011261046157604051633fabe5a360e21b815260a0816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8290839181859486936128bd575b506127295763b41b6cb160e01b8552600485fd5b6402540be400831280156128ae575b61289f57612748601654426146aa565b841061289f5769ffffffffffffffffffff908116911681116128905769ffffffffffffffffffff906008606060405161278081613f1b565b858152866020820152836040820152015282600a5583600b551669ffffffffffffffffffff19600c541617600c55600c546aff00000000000000000000600860501b16906aff00000000000000000000191617600c5560125460ff81168061284e575b5050601354612814575b7fdb6fb3cf4cc5fb760bcd63b958a53b2396776dff32c063188e864296541e76bd8380a380f35b7fd1cdd29a2fc16e6ed81266a11c8f7f06897e72e22d1bb9ccf34d63c3583d5df360206014548560135585601455604051908152a16127ed565b60407f5e5763e2a601dbb21ceae7f64e18f3d572378b373daa8d75a325f22f377f0ecb918151908152866020820152a160ff1916601255826015555f806127e3565b63b41b6cb160e01b8452600484fd5b63b41b6cb160e01b8552600485fd5b506509184e72a0008313612738565b92509350506128e4915060a03d60a0116128f3575b6128dc8183613f83565b810190614acf565b9492915092909293915f612715565b503d6128d2565b50346104615760203660031901126104615760406020916001600160a01b03612921613e30565b168152600883522054604051908152f35b5034610461576040366003190112610461576001600160a01b036040612956613e30565b9282612960613e46565b9416815260066020522091165f526020526040805f205460ff82519165ffffffffffff8116835260301c1615156020820152f35b503461046157806003193601126104615760206001600160a01b0360045416604051908152f35b50346104615780600319360112610461576020600f54604051908152f35b50346104615780600319360112610461576020604051610e108152f35b503461046157806003193601126104615760206001600160a01b03601d5416604051908152f35b503461046157606036600319011261046157612a37613e30565b60243567ffffffffffffffff811161050957612a5790369060040161401b565b9060443567ffffffffffffffff8111610fc557612a7890369060040161401b565b90926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303612b9957818103612b8a5791936001600160a01b03169185805b828110612acb575080f35b85857f272958aacfbf07577da4ede62cc7d612dfb0881c6489c961988ef59378d7709f60206001600160a01b03612b76612b21878b8f612b3d838e612b709360019f60408f918f92612b21878b612b2693614b75565b614b85565b92815260068e52208b612b42612b3d878787614b75565b614227565b165f528c5260405f209066ff000000000000825491151560301b169066ff0000000000001916179055614b75565b98614b75565b9460405195151586521693a3018690612ac0565b63c52a9bd360e01b8652600486fd5b6282b42960e81b8652600486fd5b503461046157604036600319011261046157612bc1613e30565b6001600160a01b03612bd1613e46565b91612bda614f30565b168083526011602052604083206001600160a01b0383165f5260205260405f2054918215612c525760206001600160a01b037fe4ddb9696b79889a2b0002aa61f703666d072c319c0694d71624728605bdd2879284875260118352604087208282165f5283528660405f20556040519586521693a380f35b630342954b60e21b8452600484fd5b503461046157604036600319011261046157612c7b613e30565b612c83613e46565b612c8b6158f7565b604051632474521560e21b81527fe94d78b6d8fb99b2c21131eb4552924a60f564d8515a3cc90ef300fc9735c07460048201523360248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115612ede578491612ebf575b50156117e6576001600160a01b03821680158015612eae575b612e9f576001600160a01b03600354168015612e905760206024916040519283809263b8d7b66960e01b82523360048301525afa8015612e855782918691612e39575b506001600160a01b031603612e2a577f823c9466affb5a8646bc5f7e6304f72a4622cc01af819ec2f51b1130a725c6d191612e24913386526005602052604086209060018201906001600160a01b0319825416179055600281016001600160a01b0383166001600160a01b031982541617905570010000000000000000000000000000000070ff00000000000000000000000000000000198254161790556040519182913395839092916001600160a01b0360209181604085019616845216910152565b0390a280f35b6367cc8b7560e01b8452600484fd5b9150506020813d602011612e7d575b81612e5560209383613f83565b81010312610fc557516001600160a01b0381168103610fc55781906001600160a01b03612d60565b3d9150612e48565b6040513d87823e3d90fd5b63c52a9bd360e01b8552600485fd5b63c52a9bd360e01b8452600484fd5b506001600160a01b03821615612d1d565b612ed8915060203d6020116124cb576124bd8183613f83565b5f612d04565b6040513d86823e3d90fd5b50346104615780600319360112610461576020600954604051908152f35b5034610461576020366003190112610461576001600160a01b03612f29613e30565b612f31614f30565b1680156106fc57600354816001600160a01b0382167f05ba7ce38b27f49ba3b81247ac7a13b30021ce3e90f633a2498fa9d1a09579908580a36001600160a01b0319161760035580f35b503461046157806003193601126104615750611204604051612f9e604082613f83565b601481527f53757065725061796d61737465722d352e332e330000000000000000000000006020820152604051918291602083526020830190613ff7565b50346104615760803660031901126104615760243560043560443567ffffffffffffffff8111611d3457613014903690600401613e70565b505060643560ff8116809103611d34576001600160a01b03600e54163314158061325e575b61325057600b5483111561289057611c1f194201428111611a8457831061289057600f4201804211611a84578311612890576402540be40082128015613241575b61289057604051633fabe5a360e21b815260a0816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8086928792613218575b506131a5575b5050600190600860606040516130e281613f1b565b85815260208101879052604081018890520152600a839055600b849055600c80546affffffffffffffffffffff19166a08000000000000000000001790551480613197575b613152577fdb6fb3cf4cc5fb760bcd63b958a53b2396776dff32c063188e864296541e76bd8380a380f35b6012547f5e5763e2a601dbb21ceae7f64e18f3d572378b373daa8d75a325f22f377f0ecb6040805160ff84168152866020820152a160ff1916601255826015556127ed565b5060ff601254161515613127565b8582139081613202575b506131bb575b806130cd565b601490808413156131ec57806131dc6131d76131e19387614b01565b614b19565b614b2f565b13612890575f6131b5565b806131dc6131d7866131fd94614b01565b6131e1565b611c20915061321190426146aa565b105f6131af565b909250613234915060a03d60a0116128f3576128dc8183613f83565b509392505091905f6130c7565b506509184e72a000821361307a565b6282b42960e81b8452600484fd5b506001600160a01b03845416331415613039565b50346104615780600319360112610461576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036132dd5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b63703e46dd60e11b8152600490fd5b5034610461576060366003190112610461576004359067ffffffffffffffff82116104615761012060031983360301126104615761338b6133738361335b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633146146f7565b6133636156db565b6044359060243590600401614753565b60018055604051928392604084526040840190613ff7565b9060208301520390f35b506040366003190112610461576133aa613e30565b9060243567ffffffffffffffff81116113475736602382011215611347576133dc903690602481600401359101613fc1565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168030149081156135b3575b506135a45761341e614f30565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596613570575b5061346357634c9c8ce360e01b84526004839052602484fd5b9091847f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc810361355e5750813b1561354c57806001600160a01b03197f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28151839015613532578083602061352e95519101845af4613528615d80565b91615daf565b5080f35b5050503461353d5780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d60201161359c575b8161358c60209383613f83565b81010312610fc55751945f61344a565b3d915061357f565b63703e46dd60e11b8252600482fd5b90506001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f613411565b50346104615760203660031901126104615760ff60406020926004358152601b84522054166040519015158152f35b503461046157806003193601126104615760206001600160a01b0360185416604051908152f35b50346104615780600319360112610461576020601554604051908152f35b50346104615780600319360112610461576020601454604051908152f35b503461046157604036600319011261046157613694613e30565b602435906136a06156db565b6136a9816157ff565b6136c2826001600160a01b0360025416309033906158b6565b6001600160801b038211611d255760206001600160a01b037f06653c045d0a3144153a51ac6909baae43b8d5b67184cb74e988b72858727fe492169283855260058252604085206001600160801b03613720818416828454166146d7565b166001600160801b031982541617905561373c81600f5461426e565b600f55604051908152a26001805580f35b50346104615760203660031901126104615760043561376a6156db565b3382526005602052806001600160801b0360408420541610613811573382526005602052604082206001600160801b036137a9818416828454166146b7565b166001600160801b03198254161790556137c581600f546146aa565b600f556137de81336001600160a01b03600254166157be565b6040519081527f4eea589c35918e3c4d8e0371a062a1d544e41d78fb522381678923b9cd6e6dfa60203392a26001805580f35b3382526005602052604082205463cf47918160e01b83526001600160801b0316600452602452604490fd5b50346104615761384b36613e9e565b9596989092919361385a6156db565b60405160208101906001600160a01b038c1696878352604082015260408152613884606082613f83565b5190209661389488888c8c6156fb565b946001600160a01b038a1694853b15610fc5576101048c848796958c9a9998958e6001600160a01b0396604051998a98899763cf09299560e01b8952169e8f600489015230602489015260448801526064870152608486015260a485015260e060c48501528160e4850152848401378181018301859052601f01601f1916810103018183875af1801561093b5761396d575b50509285927fecef7698217b345db7161a8d2ffa4e7109c3ca0fe6e64ca6627ee67be3e818fc86896124396124869a8760209f9b986124789b8d61240761240d93896146aa565b613978828092613f83565b6104615780613926565b50346104615760203660031901126104615760043561399f614f30565b6101f481116139e25760407f9b6bf5a61deb3c460999ea46c3ff444018a6f424eb8807d5e7e7ca031461cb9891601954908060195582519182526020820152a180f35b6358d620b360e01b8252600482fd5b50346104615760403660031901126104615780613a0c613e30565b613a14614f30565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690813b15611156576001600160a01b036044849283604051958694859363040b850f60e31b855216600484015260243560248401525af1801561093b57610da55750f35b5034610461578060031936011261046157613a9b614f30565b61067161465b565b5034610461576040366003190112610461576004359067ffffffffffffffff8211610461576101206003198336030112610461576040613ae86024356004850161428f565b825191151582526020820152f35b5034610461576020366003190112610461576040610120916001600160a01b03613b1e613e30565b1681526005602052208054906001810154906001600160a01b0360028201541665ffffffffffff600460038401549301549360ff604051966001600160801b0381168852818160801c161515602089015260881c16151560408701526001600160a01b038116606087015263ffffffff8160a01c16608087015260c01c1660a085015260c084015260e0830152610100820152f35b5034610461578060031936011261046157613bcc614f30565b6106716141e8565b503461046157606036600319011261046157613bee613e30565b6024359060038210156105095760443567ffffffffffffffff8111611d3457613c1b903690600401613e70565b906001600160a01b03600e54163303613d21577fa49f25e6b37dc7492af788d36761dc1b25f8fb6dcc448fb5637dc828725f0d88926080926001600160a01b0392879060018803613cef57613c919150848416895260056020526001600160801b03600a8160408c2054160416925b3691613fc1565b6020815191012090613ccc604051613caa604082613f83565b600d81526c088aca8408498a640a6d8c2e6d609b1b6020820152828986614f56565b613cd96040518098614151565b602087015260408601524260608601521692a280f35b60028814613d02575b613c919192613c8a565b8385168952600560205260408920546001600160801b03169150613cf8565b6282b42960e81b8552600485fd5b5034610461578060031936011261046157602060ff60125416604051908152f35b503461046157806003193601126104615760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50602036600319011261092f5760043563ffffffff811680910361092f57613dba614f30565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690813b1561092f575f90602460405180948193621cb65b60e51b8352600483015234905af18015613e2557613e17575080f35b613e2391505f90613f83565b005b6040513d5f823e3d90fd5b600435906001600160a01b038216820361092f57565b602435906001600160a01b038216820361092f57565b35906001600160a01b038216820361092f57565b9181601f8401121561092f5782359167ffffffffffffffff831161092f576020838186019501011161092f57565b9061010060031983011261092f576004356001600160a01b038116810361092f57916024356001600160a01b038116810361092f57916044356001600160a01b038116810361092f5791606435916084359160a4359160c4359160e4359067ffffffffffffffff821161092f57613f1791600401613e70565b9091565b6080810190811067ffffffffffffffff821117613f3757604052565b634e487b7160e01b5f52604160045260245ffd5b60a0810190811067ffffffffffffffff821117613f3757604052565b6040810190811067ffffffffffffffff821117613f3757604052565b90601f8019910116810190811067ffffffffffffffff821117613f3757604052565b67ffffffffffffffff8111613f3757601f01601f191660200190565b929192613fcd82613fa5565b91613fdb6040519384613f83565b82948184528183011161092f578281602093845f960137010152565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9181601f8401121561092f5782359167ffffffffffffffff831161092f576020808501948460051b01011161092f57565b8054821015614065575f52600560205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b90600182811c921680156140a7575b602083101461409357565b634e487b7160e01b5f52602260045260245ffd5b91607f1691614088565b9060405191825f8254926140c484614079565b808452936001811690811561412f57506001146140eb575b506140e992500383613f83565b565b90505f9291925260205f20905f915b8183106141135750509060206140e9928201015f6140dc565b60209193508060019154838589010152019101909184926140fa565b9050602092506140e994915060ff191682840152151560051b8201015f6140dc565b90600382101561415e5752565b634e487b7160e01b5f52602160045260245ffd5b906141b6908251815260208301516020820152604083015160408201526080806141ab606086015160a0606086015260a0850190613ff7565b940151910190614151565b90565b604090600319011261092f576004356001600160a01b038116810361092f5790602435801515810361092f5790565b601354156140e9577fd1cdd29a2fc16e6ed81266a11c8f7f06897e72e22d1bb9ccf34d63c3583d5df360206014545f6013555f601455604051908152a1565b356001600160a01b038116810361092f5790565b903590601e198136030182121561092f570180359067ffffffffffffffff821161092f5760200191813603831361092f57565b9190820180921161427b57565b634e487b7160e01b5f52601160045260245ffd5b6001600160a01b036142a0826153b4565b1691825f52600560205260405f209283549160ff8360801c16156146305760ff8360881c16614605576142d56126b285614227565b156145da5760e084019160346142eb848761423b565b90501015614582575b5f52600660205260405f206001600160a01b0361431086614227565b165f5260205260405f209460206040519661432a88613f67565b549660ff65ffffffffffff89169889835260301c1615159182910152614566576001015465ffffffffffff8160c01c16801515968761455c575b87614547575b50505f1992606861437b828861423b565b90501015614522575b506001600160a01b031691604051633ba0b9a960e01b8152602081600481875afa908115613e25575f916144f0575b50116144c557600b5480159081156144af575b50614495576143d4906153e5565b91600d5492836127100193846127101161427b57612af80180941161427b576001600160801b03936144059161549a565b928391161061446b5761441a61442093614227565b906154b3565b6144445761442f576001905f90565b5f906b1490551157d312535255115160a21b90565b505f907f4352454449545f4558434545444544000000000000000000000000000000000090565b505050505f907f494e53554646494349454e545f42414c414e434500000000000000000000000090565b505f946a5354414c455f505249434560a81b945092505050565b6144bd91506016549061426e565b42115f6143c6565b50505050505f907f524154455f434f4d4d49544d454e545f56494f4c41544544000000000000000090565b90506020813d60201161451a575b8161450b60209383613f83565b8101031261092f57515f6143b3565b3d91506144fe565b61452e9193508561423b565b60681161092f5760480135916001600160a01b03614384565b61455292975061426e565b4210945f8061436a565b8015159750614364565b505f956b1554d15497d09313d0d2d15160a21b95509350505050565b61458c838661423b565b60341161092f576001600160801b03602462030d4092013560801c1610156142f4575050505050505f907f504f53544f505f4741535f544f4f5f4c4f57000000000000000000000000000090565b50505050505f907f555345525f4e4f545f454c494749424c4500000000000000000000000000000090565b50505050505f907f4f50455241544f525f504155534544000000000000000000000000000000000090565b50505050505f907f4f50455241544f525f4e4f545f434f4e4649475552454400000000000000000090565b601d546001600160a01b0381169081156146a6576001600160a01b031916601d555f601e557fde82ad51cc1336e141528846e966b9e7f7ae89a78ebb71d1f0da0d851592d8ee5f80a2565b5050565b9190820391821161427b57565b906001600160801b03809116911603906001600160801b03821161427b57565b906001600160801b03809116911601906001600160801b03821161427b57565b156146fe57565b60405162461bcd60e51b815260206004820152602760248201527f426173655061796d61737465723a2063616c6c6572206973206e6f7420456e746044820152661c9e541bda5b9d60ca1b6064820152608490fd5b92916001600160a01b03614766856153b4565b16805f52600560205260405f209283549260ff8460801c1615614aa357614792600b546016549061426e565b945f9460ff8160881c16614a8c576147ac6126b28a614227565b15614a8c5760e089019260346147c2858c61423b565b90501015614a48575b855f52600660205260405f206001600160a01b036147e88c614227565b165f5260205260405f2060ff6040519161480183613f67565b5465ffffffffffff8116835260301c1615158060208301526149ac579083929160018c9695019485549165ffffffffffff8360c01c169081614a1c575b5050606861484e825f199961423b565b905010156149f7575b506001600160a01b031694604051633ba0b9a960e01b81526020816004818a5afa908115613e25575f916149c5575b50116149ac57614895906153e5565b600d5490816127100191826127101161427b57612af80180921161427b576148cb916148c09161549a565b809561441a8d614227565b61498b576001600160801b031683811061498b576001600160a01b03926003614939936001600160801b036149048795828a16906146b7565b166001600160801b03198254161781550161492086825461426e565b905561492e8560105461426e565b601055541698614227565b6040519860208a01521660408801526060870152608086015260a085015260a0845261496660c085613f83565b60a09190911b65ffffffffffff60a01b1660d09190911b6001600160d01b0319161790565b505050505050505090506040516149a3602082613f83565b5f815290600190565b50505050505050505090506040516149a3602082613f83565b90506020813d6020116149ef575b816149e060209383613f83565b8101031261092f57515f614886565b3d91506149d3565b614a039196508c61423b565b60681161092f5760480135946001600160a01b03614857565b5165ffffffffffff16801561483e57919a5001955065ffffffffffff861161427b578b95985f8061483e565b614a52848b61423b565b60341161092f576001600160801b03602462030d4092013560801c1610156147cb57505050505050505090506040516149a3602082613f83565b5050505050505090506040516149a3602082613f83565b505050505090506040516149a3602082613f83565b519069ffffffffffffffffffff8216820361092f57565b908160a091031261092f57614ae381614ab8565b916020820151916040810151916141b6608060608401519301614ab8565b81810392915f13801582851316918412161761427b57565b9060648202918083056064149015171561427b57565b8115614b4957600160ff1b81145f1983141661427b570590565b634e487b7160e01b5f52601260045260245ffd5b9081602091031261092f5751801515810361092f5790565b91908110156140655760051b0190565b35801515810361092f5790565b6001600160a01b0381165f52600760205260ff60405f205416908115614bb6575090565b6141b69150614ebd565b916001600160a01b0360405192816020850195168552166040830152606082015260608152614bf0608082613f83565b51902090565b8181029291811591840414171561427b57565b91908015614e3b578260a0918101031261092f57614c2682613e5c565b91614c3360208201613e5c565b6040820135906001600160a01b038080614c54608060608801359701613e5c565b97169216951693845f52600560205265ffffffffffff600160405f20015460c01c16614dfe575b835f52602160205260ff60405f205416614df657835f52602160205260405f20600160ff19825416179055845f526005602052600460405f2001908154915f19831461427b576001614ccf930190556153e5565b92600d5461271001806127101161427b57614ced6127109186614bf6565b049280841015614de7577fcde7e91a718e2439d8ff2a679ad52713e82a37b72622fb530c8c41039fdd5bf094928492614d2b604096614d8f946146aa565b906001600160801b038211614dd8575b848a6010548b818611614d9f575b5050614d5593946159b4565b865f526005602052845f206001600160801b03614d77818416828454166146d7565b166001600160801b03198254161790556010546146aa565b60105582519182526020820152a3565b7f418c06850785ce4239177091a96c1757ba1d5ba22df98a4cf818e1510fa028cd8b614d55978151908152846020820152a2938b614d49565b6001600160801b039150614d3b565b935093506140e99491506159b4565b505050505050565b845f52600660205260405f206001600160a01b0387165f5260205260405f2065ffffffffffff8042161665ffffffffffff19825416179055614c7b565b505050565b600b548015614e6157614e5d65ffffffffffff916016549061426e565b1690565b505f90565b600382101561415e5752565b906140e9604051614e8281613f4b565b608060ff60048396805485526001810154602086015260028101546040860152614eae600382016140b1565b60608601520154169101614e66565b6001600160a01b0360175416908115614f2a576001600160a01b036024602092604051948593849263710d9c6960e11b84521660048301525afa5f9181614f09575b506141b657505f90565b614f2391925060203d6020116124cb576124bd8183613f83565b905f614eff565b50505f90565b6001600160a01b035f54163303614f4357565b63118cdaa760e01b5f523360045260245ffd5b6001600160a01b0390939192931692835f52600560205260405f2060038410158061415e57846153985760ff600a5b169061415e5760028514615366575b60ff825460881c1661533c575b60018201918163ffffffff845460a01c16115f14615329578163ffffffff845460a01c160363ffffffff811161427b57835463ffffffff60a01b191660a09190911b63ffffffff60a01b161783555b83615229575b50855f52600860205260405f20936040519161501183613f4b565b42835260208301858152604084019182526060840192835260808401966150388989614e66565b805468010000000000000000811015613f375761505a9160018201815561404c565b94909461521657518455516001840155516002830155518051600383019167ffffffffffffffff8211613f37576150918354614079565b601f81116151c5575b50602090601f831160011461515e576004949392915f9183615153575b50508160011b915f199060031b1c19161790555b019251600381101561415e577fa7503227727e36abb7f0ecf24f626347ccc20233c48c554d49d7d2077a1a3040604063ffffffff946151447ffc577563f1b9a0461e24abef1e1fcc0d33d3d881f20b5df6dda59de4aae2c821986020988b9660ff80198354169116179055835192835288830190614151565ba25460a01c16604051908152a2565b015190505f806150b7565b90601f19831691845f52815f20925f5b8181106151ad575091600193918560049897969410615195575b505050811b0190556150cb565b01515f1960f88460031b161c191690555f8080615188565b9293602060018192878601518155019501930161516e565b8281111561509a57835f5260205f20601f840160051c906020851061520e575b81601f9101920160051c03905f5b82811061520157505061509a565b5f828201556001016151f3565b5f91506151e5565b634e487b7160e01b5f525f60045260245ffd5b6001600160801b03815416610bb8810290808204610bb8149015171561427b5761271090048085116152cd575b5080546001600160801b03168481106152a757506001600160801b03615281818616828454166146b7565b166001600160801b031982541617905561529d8360105461426e565b6010555b5f614ff6565b9193506001600160801b031981541690556152c48160105461426e565b601055916152a1565b60209195945060108261532292966040519481869251918291018484015e81017f2028436170706564206174203330252900000000000000000000000000000000838201520301600f19810184520182613f83565b935f615256565b825463ffffffff60a01b19168355614ff0565b857fc5437eb8dd091f69800961953f2bb0bc16ae1ff2d3e52caa96796db65f8271da5f80a2614fa1565b815471ff0000000000000000000000000000000000191671010000000000000000000000000000000000178255614f94565b505f600185036153ab5760ff6014614f85565b60ff6032614f85565b60e0810160486153c4828461423b565b905010614f2a576153d49161423b565b60481161092f576034013560601c90565b604051906153f282613f1b565b600a5490818352600b54602084015260ff6060600c549469ffffffffffffffffffff86166040820152019360501c1683525f82131561548b5760ff9161543791614bf6565b915116604d811161427b5760095461545191600a0a614bf6565b61546481670de0b6b3a764000084615b7b565b918115614b4957670de0b6b3a7640000900961547d5790565b6001810180911161427b5790565b63b41b6cb160e01b5f5260045ffd5b90612710906154aa828285615b7b565b920961547d5790565b604051633ba0b9a960e01b815291926001600160a01b039190911691602081600481865afa908115613e25575f916156a9575b50670de0b6b3a76400006154fb818385615b7b565b918309615689575b6001600160a01b03604051946370a0823160e01b86521693846004820152602081602481875afa908115613e25575f91615657575b50101561565057604051634d3c739760e11b815260048101849052602081602481865afa908115613e25575f9161561c575b5061558f90615594935f52601160205260405f20855f5260205260405f20549061426e565b61426e565b60405191632c333e2560e01b835260048301526020826024816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa918215613e25575f926155eb57501190565b9091506020813d602011615614575b8161560760209383613f83565b8101031261092f57511090565b3d91506155fa565b90506020813d602011615648575b8161563760209383613f83565b8101031261092f575161559461556a565b3d915061562a565b5050505f90565b90506020813d602011615681575b8161567260209383613f83565b8101031261092f57515f615538565b3d9150615665565b600181018091111561550357634e487b7160e01b5f52601160045260245ffd5b90506020813d6020116156d3575b816156c460209383613f83565b8101031261092f57515f6154e6565b3d91506156b7565b6002600154146156ec576002600155565b633ee5aeb560e01b5f5260045ffd5b93926157056158f7565b805f52601b60205260ff60405f2054166157b0576157239185614bc0565b805f52601b60205260ff60405f2054166157b0576127109161576e915f52601b60205260405f20600160ff19825416179055335f52601a60205260405f20549081156157a657614bf6565b0491826157785750565b335f52601c6020526001600160a01b0360405f2091165f5260205260405f206157a283825461426e565b9055565b6019549150614bf6565b623f613760e71b5f5260045ffd5b60405163a9059cbb60e01b60208201526001600160a01b039290921660248301526044808301939093529181526140e9916157fa606483613f83565b615c10565b6001600160a01b0360405191632474521560e21b83527f2024516755f401845808190bb830b0e4523d0df0845503cab52130a794699a0f60048401521660248201526020816044816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa908115613e25575f91615897575b501561588957565b6282b42960e81b5f5260045ffd5b6158b0915060203d6020116124cb576124bd8183613f83565b5f615881565b9091926001600160a01b036140e99481604051956323b872dd60e01b60208801521660248601521660448401526064830152606482526157fa608483613f83565b604051632474521560e21b81527f2024516755f401845808190bb830b0e4523d0df0845503cab52130a794699a0f60048201523360248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115613e25575f9161589757501561588957565b6001600160a01b03805f549216918282198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6001600160a01b0390939192931691823b1561092f57604051635c1d516f60e11b81526001600160a01b038216600482015260248101859052604481018390525f9290838160648183895af19081615ad1575b50615aca57833b15610509576040516330f5344160e01b81526001600160a01b038316600482015260248101869052604481019190915282808260648183895af19182615ab5575b5050615aaf576001600160a01b03602091604084867f8d05946ad7acf1695cdb2c1c7b76b11a907b33e5224f086eea17d6a23841e17f965260118552208282165f52835260405f20615aa287825461426e565b90556040519586521693a3565b50505050565b81615abf91613f83565b61050957825f615a4f565b5050505050565b615ade9194505f90613f83565b5f925f615a07565b604051633fabe5a360e21b815260a0816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa5f9181615b55575b50615b385750600190565b8015615b4f57610e10810180911161427b57421190565b50600190565b615b6f91925060a03d60a0116128f3576128dc8183613f83565b5092505050905f615b2d565b9091828202915f1984820993838086109503948086039514615c025784831115615bf357829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b63227bc15360e01b5f5260045ffd5b505091508115614b49570490565b5f806001600160a01b03615c3993169360208151910182865af1615c32615d80565b9083615daf565b8051908115159182615c61575b5050615c4f5750565b635274afe760e01b5f5260045260245ffd5b615c749250602080918301019101614b5d565b155f80615c46565b90919392935f906001600160a01b03831615615d77576040519160048301602484019560448501916064860193873b15615ce65750936064938a80948a9b9c9460209b9a9998630b135d3f60e11b8a525260408a52523701915afa9051630b135d3f60e11b141690565b999350509395505080604014615d3357604114615d035750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9192939550602081013590601b8260ff1c016020523560405216606052615d16565b505f9450505050565b3d15615daa573d90615d9182613fa5565b91615d9f6040519384613f83565b82523d5f602084013e565b606090565b90615dd35750805115615dc457805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580615e00575b615de4575090565b6001600160a01b0390639996b31560e01b5f521660045260245ffd5b50803b15615ddc56fef0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a26469706673582212208d7213986a44b5ed7b0ad232c58976998c1058b9b1a76d198a649762f4ac986764736f6c63430008210033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00" } diff --git a/contracts/src/paymasters/superpaymaster/v3/SuperPaymaster.sol b/contracts/src/paymasters/superpaymaster/v3/SuperPaymaster.sol index 68f91a70..fab4ca4f 100644 --- a/contracts/src/paymasters/superpaymaster/v3/SuperPaymaster.sol +++ b/contracts/src/paymasters/superpaymaster/v3/SuperPaymaster.sol @@ -1353,13 +1353,22 @@ contract SuperPaymaster is BasePaymasterUpgradeable, ReentrancyGuard, ISuperPaym // Pending Debt Recovery // ==================================== - /// @notice Retry recording a pending debt that failed during postOp - /// @param token The xPNTs token address - /// @param user The user address - function retryPendingDebt(address token, address user) external onlyOwner nonReentrant { - uint256 amount = pendingDebts[token][user]; - if (amount == 0) revert NoPendingDebt(); - delete pendingDebts[token][user]; + /// @notice Retry recording a pending debt that failed during postOp. + /// @dev H-01: takes an explicit `amount` so a pending balance larger than the + /// token's per-tx limit (`maxSingleTxLimit`) can be drained in chunks — + /// call repeatedly with `amount <= maxSingleTxLimit` until empty. Previously + /// it always retried the full balance, which reverted (and stayed stuck) + /// whenever the accumulated debt exceeded that limit. The remainder stays in + /// `pendingDebts` for the next call. Pass `amount == 0` to attempt the full + /// balance in one shot (works when it is within the limit). + /// @param token The xPNTs token address + /// @param user The user address + /// @param amount aPNTs to record this call; clamped to the pending balance. + function retryPendingDebt(address token, address user, uint256 amount) external onlyOwner nonReentrant { + uint256 pending = pendingDebts[token][user]; + if (pending == 0) revert NoPendingDebt(); + if (amount == 0 || amount > pending) amount = pending; + pendingDebts[token][user] = pending - amount; IxPNTsToken(token).recordDebt(user, amount); emit PendingDebtRetried(token, user, amount); } diff --git a/contracts/test/v3/SuperPaymaster_BurnRestore.t.sol b/contracts/test/v3/SuperPaymaster_BurnRestore.t.sol index f479b9a9..8c75742f 100644 --- a/contracts/test/v3/SuperPaymaster_BurnRestore.t.sol +++ b/contracts/test/v3/SuperPaymaster_BurnRestore.t.sol @@ -252,6 +252,35 @@ contract SuperPaymaster_BurnRestore_Test is Test { assertGt(paymaster.pendingDebts(address(xpnts), user1), 0, "pendingDebts must be non-zero"); } + // ── H-01: chunked retryPendingDebt drains a balance over multiple calls ────── + function test_RetryPendingDebt_Chunked() public { + // 1. Accumulate a pending debt (both burn + recordDebt fail in postOp). + xpnts.setRecordDebtFail(true); + bytes memory ctx = _runValidate(); + vm.prank(address(entryPoint)); + paymaster.postOp(IPaymaster.PostOpMode.opSucceeded, ctx, MAX_COST, 0); + uint256 pending = paymaster.pendingDebts(address(xpnts), user1); + assertGt(pending, 1, "setup: pending must be > 1"); + + // 2. recordDebt works again; drain in a chunk smaller than the balance. + xpnts.setRecordDebtFail(false); + address owner = paymaster.owner(); + uint256 chunk = pending / 2; + vm.prank(owner); + paymaster.retryPendingDebt(address(xpnts), user1, chunk); + assertEq(paymaster.pendingDebts(address(xpnts), user1), pending - chunk, "chunk 1 leaves remainder"); + + // 3. amount == 0 drains the full remainder. + vm.prank(owner); + paymaster.retryPendingDebt(address(xpnts), user1, 0); + assertEq(paymaster.pendingDebts(address(xpnts), user1), 0, "fully drained"); + + // 4. retrying an empty balance reverts. + vm.prank(owner); + vm.expectRevert(SuperPaymaster.NoPendingDebt.selector); + paymaster.retryPendingDebt(address(xpnts), user1, 0); + } + // ── Test 4: Two consecutive ops → different burns (not replay) ──────────── function test_PostOp_TwoOps_NoDuplicateReplay() public { diff --git a/docs/operations/pending-debt-runbook.md b/docs/operations/pending-debt-runbook.md new file mode 100644 index 00000000..32cc2059 --- /dev/null +++ b/docs/operations/pending-debt-runbook.md @@ -0,0 +1,43 @@ +# Operations runbook — pending debt retry (H-01) + +## What `pendingDebts` is + +`SuperPaymaster.pendingDebts[token][user]` is a last-resort accumulator. During +`postOp`, `_recordDebt` tries, in order: `burnFromWithOpHash` (pull from the user's +xPNTs balance) → `recordDebtWithOpHash` (book the debt) → and only if BOTH revert does +the amount land in `pendingDebts`. In normal operation this is always 0. It is non-zero +only in exceptional cases (a single op whose aPNTs cost exceeds the token's +`maxSingleTxLimit`, an emergency-disabled token, or a temporarily unreachable token). + +## The H-01 issue (fixed) + +`recordDebt` reverts when `amount > maxSingleTxLimit` (5000 aPNTs). The old +`retryPendingDebt(token, user)` always retried the **full** pending balance, so once the +accumulator exceeded that limit the retry reverted forever — the debt could only be +written off via `clearPendingDebt` (the protocol eats it). + +## The fix — chunked retry + +```solidity +function retryPendingDebt(address token, address user, uint256 amount) external onlyOwner +``` + +`amount` is recorded this call and clamped to the pending balance; the remainder stays +in `pendingDebts`. So a balance larger than `maxSingleTxLimit` is drained over multiple +calls instead of writing it off. + +## Management-backend / operational rule + +To drain a stuck pending debt: + +1. Read `pendingDebts(token, user)` and the token's `maxSingleTxLimit()` (5000 aPNTs default). +2. If `pending <= maxSingleTxLimit`: call `retryPendingDebt(token, user, 0)` once (0 = full balance). +3. If `pending > maxSingleTxLimit`: call `retryPendingDebt(token, user, maxSingleTxLimit)` + **repeatedly** until `pendingDebts(token, user) == 0`. Each call books one chunk as + real user debt. +4. Only use `clearPendingDebt(token, user)` (write-off, protocol absorbs the loss) when + the debt is genuinely unrecoverable (token permanently unreachable / user gone). + +**Backend implementation note:** the retry loop must be idempotent and re-read +`pendingDebts` after each tx (the value shrinks per call). Prefer recovering the debt +(step 3) over writing it off (step 4); reserve write-off for unrecoverable cases and log it. diff --git a/docs/security/2026-05-31-pk-audit-findings.md b/docs/security/2026-05-31-pk-audit-findings.md index 66033849..2a04dfc9 100644 --- a/docs/security/2026-05-31-pk-audit-findings.md +++ b/docs/security/2026-05-31-pk-audit-findings.md @@ -116,3 +116,52 @@ Each fix ships with a regression test that **fails on current code and passes af - `PoC_C02_UnsignedDrain.t.sol` ✅ faithful (real xPNTs auto-allowance) - `PoC_C03_RecipientRedirect.t.sol` ✅ faithful (real EIP-3009 sig) - `PoC_C04_ForcedPostOpOOG.t.sol` ✅ faithful (real EntryPoint handleOps; replaces the removed dead-code PoC) + +--- + +## Final resolution (2026-06-01) — fixes landed + per-fix Codex challenge review + +| Finding | Status | Commit / note | +|---|---|---| +| **C-04** | ✅ FIXED (3 Codex rounds clean) | `MIN_POST_OP_GAS = 200_000` floor in validate + dryRun; dead `postOpReverted` branch removed. 200k measured (postOp ~141k), not Codex's 250k over-estimate. | +| **C-01** | ✅ FIXED | `b9c13af7`. Balance-aware `_creditExceeded`: pay-from-balance → allowed; else `getDebt + pendingDebts + charge <= getCreditLimit`. **TOCTOU (balance moved between validate and postOp) ACCEPTED by jhf** as a bounded one-op overrun — recovery via mint auto-repayment (`xPNTsToken._update`, mint-only = B1) + manual `repayDebt`. exchangeRate read from `xPNTsToken.exchangeRate()` (consistent with AirAccount #10). | +| **C-02** | ✅ FIXED — Codex approved mainnet | `d7df0c3e`. `settleX402PaymentDirect` requires payer EIP-712 `X402PaymentAuthorization(from,to,asset,amount,maxFee,validBefore,nonce)`, domain `verifyingContract = SP proxy`, `SignatureCheckerLib` (EOA + ERC-1271). | +| **C-03** | ✅ FIXED — Codex approved mainnet | `d7df0c3e`. `settleX402Payment` binds recipient via `nonce = keccak256(to, salt)` — reuses the payer's EIP-3009 signature, no second sig. | +| **L-01** | 📝 ACCEPTED as a feature (not fixed) | Codex flagged: X402 auth not bound to `msg.sender` → another approved facilitator can front-run the fee (payer funds 100% safe; only fee attribution). **jhf decision: keep it — decentralized facilitator competition is the intended model; you sign once, whoever serves first earns.** `facilitator` deliberately NOT bound into the signature (preserves flexible routing). | +| **I-01** | ↪ off-chain WYSIWYS, see below | On-chain nonce/recipient binding is tamper-evident; the residual "malicious UI" risk is solved off-chain (passkey-bound signing + clear-signing display). Converges with AirAccount KMS #16. | + +### Verification +- 969 forge tests pass / 0 failed. SuperPaymaster 24,093 bytes (EIP-170 OK, 483 spare). +- PoC_C02/PoC_C03 rewritten as fix regressions (no-sig drain reverts; redirect reverts; valid-sig happy paths pass). +- AirAccount KMS EIP-712 digest is standard `keccak256(0x1901 || domainSeparator || hashStruct)` — **compatible with SP `_verifyX402Auth`**. + +### Cross-repo dependencies +- **aastar-sdk #39** (filed): client must sign `X402PaymentAuthorization` (direct) + derive EIP-3009 `nonce = keccak256(to, salt)` (USDC). Canonical x402 integration lives in the SDK; in-repo `packages/x402-facilitator-node` is deprecated. +- **AirAccount KMS #16** (their repo): host-compromise → arbitrary `sign_typed_data` would let a forged X402 authorization pass SP's on-chain check for AirAccount (ERC-1271) users. SP's C-02 gate is necessary but end-to-end security for AirAccount accounts ALSO needs KMS passkey-bound JWT issuance (their fix A). **On-chain fix + KMS fix together = complete.** + +--- + +## KMS integration consistency — CONFIRMED OK (2026-06-01, AirAccount #16 / PR #20) + +AirAccount closed KMS Issue #16 (PR #20, 5 rounds): removed the JWT signing oracle +(JwtHmacSign/JwtSignPayload as external TA commands), folded JWT issuance into +`create_agent_key` (WebAuthn-gated), added TA passkey auth to `sign_typed_data`, and +made the TA own the JWT `iat`. **Impact on SuperPaymaster x402: none on the interface, +positive on end-to-end security.** The dual-payer x402 design maps cleanly onto two +SEPARATE TA command paths — confirmed by AirAccount: + +| x402 payer | TA command | Auth | Passkey per payment? | +|---|---|---|---| +| Human user (manual EIP-712) | `sign_typed_data` (cmd 17) | passkey, user present | yes (by design) | +| Human grants a session key | `sign_grant_session` / `sign_p256_grant_session` (PR #19) | passkey once | once, at delegation | +| **Autonomous agent (x402 micropayment)** | `sign_agent_user_op` (cmd 12) | **JWT, no passkey** | **no** | + +Agent x402 micropayments go through `sign_agent_user_op` (JWT auth) — #16's passkey +gating on `sign_typed_data` does NOT touch this path. Lifecycle: `create_agent_key` +(passkey once) → `grant_session` (passkey once) → every x402 via `sign_agent_user_op` +(JWT, 0 passkey). So C-02's `_verifyX402Auth` (ERC-1271) accepts both: human-signed +(passkey path) and agent-signed (session-key path) authorizations, with no contract change. + +- Signature format unchanged (standard EIP-712 digest); our on-chain verification is auth-method-agnostic. +- #16 resolves the C-02 ↔ KMS dependency flagged in I-01 (host compromise can no longer forge a human's X402 authorization). +- **Open coordination item (low):** confirm `sign_grant_session` / `sign_p256_grant_session` (PR #19) are themselves passkey-gated — that is the human-delegation moment and should require user presence. If not, flag to AirAccount. diff --git a/script/gasless-tests/test-group-B5-dry-run-pending-debt.js b/script/gasless-tests/test-group-B5-dry-run-pending-debt.js index 67273246..cc31b933 100755 --- a/script/gasless-tests/test-group-B5-dry-run-pending-debt.js +++ b/script/gasless-tests/test-group-B5-dry-run-pending-debt.js @@ -22,7 +22,7 @@ const SP_DRY_ABI = [ // Pending debt tracking "function pendingDebts(address token, address user) view returns (uint256)", // Owner-only recovery functions - "function retryPendingDebt(address token, address user) external", + "function retryPendingDebt(address token, address user, uint256 amount) external", "function clearPendingDebt(address token, address user) external", ]; @@ -172,7 +172,10 @@ async function main() { printSkip('No pending debts — retryPendingDebt not applicable'); } else { try { - const r = await sendTxSafe(sp, 'retryPendingDebt', [config.aPNTs, deployerAddr], 'retryPendingDebt'); + // H-01: 3rd arg is the chunk to record this call; 0 = full pending balance + // (clamped to the balance). Use repeated calls with amount <= maxSingleTxLimit + // to drain a balance larger than the per-tx limit. + const r = await sendTxSafe(sp, 'retryPendingDebt', [config.aPNTs, deployerAddr, 0n], 'retryPendingDebt'); if (r) { const debtAfter = await sp.pendingDebts(config.aPNTs, deployerAddr); printKeyValue('pendingDebt after retry', ethers.formatEther(debtAfter)); @@ -180,10 +183,12 @@ async function main() { printSuccess(`pendingDebt decreased after retryPendingDebt (${ethers.formatEther(pendingDebt)} → ${ethers.formatEther(debtAfter)})`); pendingDebt = debtAfter; } else { - // retryPendingDebt deletes the mapping then calls xPNTs.recordDebt. - // If recordDebt succeeds, pendingDebts[token][user] is now 0. - // If recordDebt reverts, retryPendingDebt itself reverts (no partial state). - printInfo(`pendingDebt unchanged after retry — xPNTs.recordDebt may have also reverted`); + // retryPendingDebt records `amount` (here the full balance) via xPNTs.recordDebt, + // leaving the remainder in pendingDebts. With amount=0 and recordDebt succeeding, + // pendingDebts[token][user] is now 0. If recordDebt reverts, the call reverts + // (no partial state) — e.g. the balance exceeds maxSingleTxLimit, so pass a + // chunk <= the limit instead. + printInfo(`pendingDebt unchanged after retry — xPNTs.recordDebt may have reverted (try a chunk <= maxSingleTxLimit)`); } } } catch (e) {