mirror of
https://github.com/luxfi/threshold.git
synced 2026-10-30 15:15:53 +00:00
The stack had two different numbers called "threshold". cmp.Keygen and
frost.Keygen take t, the polynomial degree, and need t+1 signers. Operators,
dashboards and runbooks say k-of-n. Provisioning a "3-of-5" wallet by passing
threshold=3 produces a 4-of-5, silently — nothing errors, and the mistake only
surfaces when three custodians hold a ceremony and cannot sign a key that
already holds value.
pkg/quorum is now the single place those two numbers meet. Policy{K,N} states
what operators mean; Degree() == K-1 is the only k->t conversion in the tree.
Callers pass policy.Degree() and never compute the off-by-one themselves.
Proofs, all against the real protocols rather than mocks:
protocols/quorum_3of5_test.go — five-party CGGMP21 DKG at the policy degree,
three parties sign, and the signature both verifies under the group key and
ECRECOVERS to the group's EVM address. Recovery is the part that matters for
custody: a key can verify correctly and still resolve to an address no one
controls. Four different 3-subsets all sign for one address. Negatives: every
2-of-5 subset is refused, and a forged third share cannot produce a signature
that verifies. FROST covered at the same policy.
protocols/safe_3of5_test.go — the custody claim end to end. Real SafeL2 v1.5.0
bytecode behind the real SafeProxyFactory on the luxfi/geth EVM, owned solely
by the 3-of-5 group address. The digest comes from the deployed Safe's own
getTransactionHash, so the test cannot sign something the contract would not
check. execTransaction succeeds, value moves, the nonce advances, a replay is
rejected, and a valid signature from a different 3-of-5 key is rejected.
Fixes found along the way:
protocols/lss/adapters/evm.go — GenerateEVMAddress hashed the COMPRESSED
point, i.e. 32 bytes of X, where the EVM requires Keccak over the 64-byte
uncompressed X||Y. Every address it produced was well-formed and belonged to
no key; value sent to one is unspendable. It had no callers, so this was a
loaded gun rather than a live wound. Now decompresses, and reports failure
instead of returning a plausible wrong answer.
internal/test/harness.go — WithTimeout moved the harness deadline but not the
handler's own ProtocolTimeout, which was hard-coded to five minutes, so a
raised timeout silently did nothing and a CGGMP21 DKG under -race died at
five minutes blaming the context. The harness now owns one deadline. Also
removes a duplicate RunProtocolWithTimeout.
protocols/cmp/cmp_threshold_test.go — cases labelled "3-of-5" passed degree 3
and signed with four parties. They were 4-of-5. Labels now derive from the
policy, so the name and the behaviour are one fact.
go.sum — was missing entries for luxfi/metric and mattn/go-isatty; the FROST
packages did not compile from a clean checkout.
Co-authored-by: Hanzo Dev <[email protected]>
1 line
22 KiB
Plaintext
1 line
22 KiB
Plaintext
60808060405234601a576001600455612c83908161001f8239f35b5f80fdfe608060405260043610156100a1575b3615610073573461006f577f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d554801561006d575f8060405192368285373360601b36850152838260143601925af13d5f833e15610069573d90f35b3d90fd5b005b5f80fd5b6040513481527f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d60203392a2005b5f5f3560e01c80630d582f1314611b1757806312fb68e014611ab65780631fcac7f314611a6d5780632d9ad53d14611a4a5780632f54bf6e146119f4578063468721a7146119b45780635229073f1461194a5780635624b25b146118cb5780635ae6bd37146118a1578063610b59251461179a578063694e80c31461173e5780636a761202146111025780637d832974146110bf578063934f3a1114611061578063a0e67e2b14610fd0578063affed0e014610fb2578063b4faba0914610f4d578063b63e800d14610b9d578063cc2f8452146109e2578063d4d9bdcd14610942578063d8d11f78146108c6578063e009cfde146107bc578063e068df37146106b4578063e19a9dd914610591578063e318b52b146104a0578063e75235b814610482578063f08a032314610427578063f698da25146103d1578063f855438b14610383578063f8dc5dd9146102505763ffa1ad7414610201575061000e565b3461024d578060031936011261024d5750610249604051610223604082611cd9565b60058152640312e352e360dc1b6020820152604051918291602083526020830190611dcf565b0390f35b80fd5b503461024d57606036600319011261024d5761026a611c29565b610272611c82565b906044359161027f61257c565b600354801561036f5783905f1901806003551061036a576102a08183612b73565b6001600160a01b039081168085526002602081815260408088205495851688528282528088208054969095166001600160a01b0319968716179094558287525290842080549092169091557ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf8380a2806004540361031c575080f35b61032461257c565b600354811161036a578015610365576020817f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c9392600455604051908152a180f35b61265a565b61262d565b634e487b7160e01b85526011600452602485fd5b503461024d57606036600319011261024d5761039d611c29565b604435906001600160401b0382116103cd576103c06103ca923690600401611d5f565b9060243590612539565b80f35b8280fd5b503461024d578060031936011261024d57602061041f60606040517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921881524660208201523060408201522090565b604051908152f35b503461024d57602036600319011261024d57610441611c29565b61044961257c565b61045281612b12565b6001600160a01b03167f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b08280a280f35b503461024d578060031936011261024d576020600454604051908152f35b503461024d57606036600319011261024d576104ba611c29565b6104c2611c82565b906104cb611c55565b916104d461257c565b6104dd836125b2565b6104e78183612b73565b6001600160a01b039081168085526002602081815260408088205496851680895283835281892080549887166001600160a01b0319998a161790559590941687528181528387208054871686179055828752529084208054909316909255907ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf8380a27f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea268280a280f35b503461024d57602036600319011261024d576105ab611c29565b6105b361257c565b6001600160a01b0381169081151580610641575b610614577f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa28280a280f35b60405162461bcd60e51b8152602060048201526005602482015264047533330360dc1b6044820152606490fd5b506040516301ffc9a760e01b815263736bd41d60e11b6004820152602081602481865afa9081156106a957849161067a575b50156105c7565b61069c915060203d6020116106a2575b6106948183611cd9565b810190612521565b5f610673565b503d61068a565b6040513d86823e3d90fd5b503461024d57602036600319011261024d576106ce611c29565b6106d661257c565b6001600160a01b0381169081151580610764575b610737577fb104e0b93118902c651344349b610029d694cfdec91c589c91ebafbcd0289947557fcd1966d6be16bc0c030cc741a06c6e0efaf8d00de2c8b6a9e11827e125de8bb88280a280f35b60405162461bcd60e51b8152602060048201526005602482015264475333303160d81b6044820152606490fd5b506040516301ffc9a760e01b8152630b0803db60e31b6004820152602081602481865afa9081156106a957849161079d575b50156106ea565b6107b6915060203d6020116106a2576106948183611cd9565b5f610796565b503461024d57604036600319011261024d576107d6611c29565b6107de611c82565b6107e661257c565b6001600160a01b031690811580156108bc575b6108b7576001600160a01b039081168084526001602052604084205490911682900361088a578183526001602081815260408086205493865282825280862080546001600160a01b039095166001600160a01b03199586161790558486529190528320805490911690557faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace40542768280a280f35b60405162461bcd60e51b8152602060048201526005602482015264475331303360d81b6044820152606490fd5b612687565b50600182146107f9565b503461024d5761014036600319011261024d576108e1611c29565b6044356001600160401b0381116103cd57610900903690600401611cac565b60643593600285101561024d57602061041f8686868661091e611c3f565b91610927611c6b565b93610124359560c4359360a43593608435936024359061245f565b503461024d57602036600319011261024d5733815260026020526040812054600435906001600160a01b0316156109b5573382526008602052604082208183526020526001604083205533907ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c8380a380f35b60405162461bcd60e51b8152602060048201526005602482015264047533033360dc1b6044820152606490fd5b503461024d57604036600319011261024d576109fc611c29565b6001600160a01b038116906024359060018314159081610b8c575b50610b5f578015610b3257610a2b81612405565b918352600160205260408320548392906001600160a01b03165b6001600160a01b0381169081151580610b27575b80610b1e575b15610a96575080610a708584612437565b528452600160205260408420546001600160a01b031692610a9090611e2f565b92610a45565b9193919250505f196001600160a01b03831601610add575b610ac993508252604051928392604084526040840190611df3565b6001600160a01b0390911660208301520390f35b90505f198101818111610b0a57610ac993506001600160a01b0390610b029084612437565b511690610aae565b634e487b7160e01b84526011600452602484fd5b50838510610a5f565b506001821415610a59565b60405162461bcd60e51b815260206004820152600560248201526423a998981b60d91b6044820152606490fd5b60405162461bcd60e51b8152602060048201526005602482015264475331303560d81b6044820152606490fd5b610b96915061233e565b155f610a17565b503461024d5761010036600319011261024d576004356001600160401b038111610f495736602382011215610f49578060040135906001600160401b0382116103cd576024808201918360051b0101368111610f455760243591610bff611c55565b906064356001600160401b038111610f4157610c1f903690600401611cac565b6084356001600160a01b03811694929190858103610f3d5760a435956001600160a01b0387168703610f39578a95979860c43599610c5b611c3f565b998c604051998160808c0160808d525260a08b019183915b818110610f13575050508360208b01527f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a860018060a01b038a169a8b60408201528660608201528033930390a2610cc98d6123ee565b9c610cd76040519e8f611cd9565b8d5260208d015b828210610efb57505050600454610ece578a51811161036a5780156103655760018b519b8d905b8d8210610e665750509a610d51969798999a9b60018060a01b03168d52600260205260408d2060016001600160601b0360a01b825416179055600355600455610e57575b503691611d29565b600180885260205260408720549092906001600160a01b0316610e2a576001875260016020526040872060016001600160601b0360a01b825416179055610daf575b505082610d9e578380f35b610da7926129f8565b505f80808380f35b803b15610dfd5785918291602082519201905f19f415610dd0575f80610d93565b60405162461bcd60e51b8152602060048201526005602482015264047533030360dc1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600560248201526423a998181960d91b6044820152606490fd5b60405162461bcd60e51b8152602060048201526005602482015264047533130360dc1b6044820152606490fd5b610e6090612b12565b5f610d49565b6001600160a01b03610e788383612437565b5116926001600160a01b0316808414610ec9578f938f94604090600193610e9e846125b2565b8152600260205220828060a01b0382166001600160601b0360a01b8254161790559201919250610d05565b6126b4565b60405162461bcd60e51b8152602060048201526005602482015264047533230360dc1b6044820152606490fd5b60208091610f0884611c98565b815201910190610cde565b909192602080600192838060a01b03610f2b88611c98565b168152019401929101610c73565b8a80fd5b8980fd5b8680fd5b8380fd5b5080fd5b503461024d57604036600319011261024d5780610f68611c29565b602435906001600160401b038211610fae57610f8983923690600401611d5f565b90602082519201905af4906040519182523d60208301523d90604083013e60403d0190fd5b5050fd5b503461024d578060031936011261024d576020600554604051908152f35b503461024d578060031936011261024d57610fec600354612405565b600182526002602052604082205490919081906001600160a01b03165b6001600160a01b03166001811461104b57806110258486612437565b528152600260205260408120546001600160a01b03169161104590611e2f565b91611009565b6040516020808252819061024990820187611df3565b503461024d57606036600319011261024d576024356001600160401b038111610f4957611092903690600401611cac565b50506044356001600160401b038111610f49576110b66103ca913690600401611d5f565b60043533612539565b503461024d57604036600319011261024d576020906040906001600160a01b036110e7611c29565b16815260088352818120602435825283522054604051908152f35b5061014036600319011261006f57611118611c29565b6044356001600160401b03811161006f57611137903690600401611cac565b906002606435101561006f5761114b611c3f565b92611154611c6b565b91610124356001600160401b03811161006f57611175903690600401611d5f565b9161128b6005547f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed6111fc8861125a600454604051908660208301523360408301526060820152606081526111cb608082611cd9565b61124b8d60405195869560018060a01b038c168752602435602088015261016060408801526101608701908d612374565b9061120c60608701606435612394565b608435608087015260a43560a087015260c43560c08701526001600160a01b0390811660e08701528d166101008601528481036101208601528b611dcf565b90838203610140850152611dcf565b0390a161126681611e2f565b6005556001600160a01b0386168860c43560a4356084356064358c8a6024358b61245f565b94611297848733612539565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8546001600160a01b03169384611667575b505a6109c46084350160843511611653576109c460843501603f60843560061b0410155f1461164657603f60843560061b04905b6101f482018092116115f45710611619575a928860c43561160857505a806109c3198101116115f4579161133d8a949285946109c31901925b3691611d29565b916064356001036115e15760208351930191f4925b5a8281116115dd5782039182116115c95783159586806115bf575b806115b5575b6115aa57859288809360c435611461575b50505050835f146114315760207f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e91604051908152a25b806113cd575b60208460405190158152f35b908185923b156103cd57604051631264e26d60e31b8152600481019490945290151560248401528290604490829084905af1801561142657611411575b80806113c1565b61141c838092611cd9565b610f49578161140a565b6040513d85823e3d90fd5b60207f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d2391604051908152a26113bb565b929450909250906001600160a01b0381166115a4575032925b6001600160a01b03811661151057509061149660a435826123e1565b908110610f495781806114b881933a60c435105f146115095760c43590612609565b9485906001600160a01b03165af13d15611504573d6114d681611d0e565b906114e46040519283611cd9565b81528760203d92013e5b156114ff5783905b5f808881611384565b61273b565b6114ee565b3a90612609565b61151c60a435846123e1565b928310610f495761153260209360c43590612609565b93826040518581019263a9059cbb60e01b845260018060a01b0316602482015286604482015260448152611567606482611cd9565b519261270f195a01f13d801561159e576020146115925750855b1561158d5783906114f6565b61270e565b86511590151715611581565b50611581565b9261147a565b6040513d89823e3d90fd5b5060c43515611373565b506084351561136d565b634e487b7160e01b87526011600452602487fd5b8780fd5b906020835193019160243591f192611352565b634e487b7160e01b8a52601160045260248afd5b92909161133d849360843592611336565b60405162461bcd60e51b8152602060048201526005602482015264047533031360dc1b6044820152606490fd5b6109c460843501906112fd565b634e487b7160e01b89526011600452602489fd5b843b1561006f57604051633af85da960e11b81526001600160a01b038416600482015260248035908201526101606044820152905f9082908190611706906116b46101648401888b612374565b906116c460648501606435612394565b608480359085015260a480359085015260c48035908501526001600160a01b03808f1660e48601528c1661010485015283820360031901610124850152611dcf565b33610144830152038183895af1801561173357156112c95761172b9198505f90611cd9565b5f965f6112c9565b6040513d5f823e3d90fd5b3461006f57602036600319011261006f5760043561175a61257c565b600354811161036a578015610365576020817f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c9392600455604051908152a1005b3461006f57602036600319011261006f576117b3611c29565b6117bb61257c565b6001600160a01b031680158015611897575b6108b7575f818152600160205260409020546001600160a01b031661186a57600160208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80545f8481526040812080546001600160a01b039093166001600160a01b0319938416179055928352815416831790557fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f84409080a2005b60405162461bcd60e51b815260206004820152600560248201526423a998981960d91b6044820152606490fd5b50600181146117cd565b3461006f57602036600319011261006f576004355f526007602052602060405f2054604051908152f35b3461006f57604036600319011261006f576004356024358060051b916118f083611d0e565b926118fe6040519485611cd9565b80845261190d601f1991611d0e565b013660208501375f5b828110611933576040516020808252819061024990820187611dcf565b8060019183015460208260051b8701015201611916565b3461006f5761199661197861195e36611d7d565b90611970828285879997989698612768565b959096612906565b80926040519460203d8701016040523d86523d5f602088013e612939565b61024960405192839215158352604060208401526040830190611dcf565b3461006f5760206119e26119ea6119ca36611d7d565b906119da82828587999699612768565b969094612906565b928391612939565b6040519015158152f35b3461006f57602036600319011261006f576001600160a01b03611a15611c29565b16600181148015611a2d575b60209060405190158152f35b505f526002602052602060018060a01b0360405f20541615611a21565b3461006f57602036600319011261006f5760206119ea611a68611c29565b61233e565b3461006f57608036600319011261006f57611a86611c29565b604435906001600160401b03821161006f57611aa961006d923690600401611d5f565b6064359160243590611e51565b3461006f57608036600319011261006f576024356001600160401b03811161006f57611ae6903690600401611cac565b50506044356001600160401b03811161006f57611b0a61006d913690600401611d5f565b6064359060043533611e51565b3461006f57604036600319011261006f57611b30611c29565b60243590611b3c61257c565b611b45816125b2565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e080546001600160a01b039283165f818152604081208054959093166001600160a01b0319958616179092556001909152815490921682179055600354611bb090611e2f565b90816003557f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea265f80a28160045403611be457005b611bec61257c565b811161036a578015610365576020817f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c9392600455604051908152a1005b600435906001600160a01b038216820361006f57565b60e435906001600160a01b038216820361006f57565b604435906001600160a01b038216820361006f57565b61010435906001600160a01b038216820361006f57565b602435906001600160a01b038216820361006f57565b35906001600160a01b038216820361006f57565b9181601f8401121561006f578235916001600160401b03831161006f576020838186019501011161006f57565b90601f801991011681019081106001600160401b03821117611cfa57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b038111611cfa57601f01601f191660200190565b929192611d3582611d0e565b91611d436040519384611cd9565b82948184528183011161006f578281602093845f960137010152565b9080601f8301121561006f57816020611d7a93359101611d29565b90565b608060031982011261006f576004356001600160a01b038116810361006f579160243591604435906001600160401b03821161006f57611dbf91600401611d5f565b90606435600281101561006f5790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90602080835192838152019201905f5b818110611e105750505090565b82516001600160a01b0316845260209384019390920191600101611e03565b5f198114611e3d5760010190565b634e487b7160e01b5f52601160045260245ffd5b918051611e5d856125db565b11612311575f91825b858410611e7557505050505050565b83604102830190602082015191606060408201519101515f1a908093809280155f146120af575050506001600160a01b031691611eb1886125db565b81106120aa57611ec0816123d3565b81811061006f5785511061207d57602081860101908151611ee0826123d3565b91821061006f57611ef190826123e1565b90811061006f57855110612050576020611f2d9160405180938192630b135d3f60e11b8352886004840152604060248401526044830190611dcf565b0381865afa908115611733575f9161200e575b506001600160e01b0319166374eca2c160e11b01611fe1575b6001600160a01b0390811690821690811180159190611fc2575b8115611fb7575b50611f8a57600190930192611e66565b60405162461bcd60e51b815260206004820152600560248201526423a998191b60d91b6044820152606490fd5b60019150145f611f7a565b5f818152600260205260409020546001600160a01b0316159150611f73565b60405162461bcd60e51b815260206004820152600560248201526411d4cc0c8d60da1b6044820152606490fd5b90506020813d8211612048575b8161202860209383611cd9565b8101031261006f57516001600160e01b03198116810361006f575f611f40565b3d915061201b565b60405162461bcd60e51b8152602060048201526005602482015264475330323360d81b6044820152606490fd5b60405162461bcd60e51b815260206004820152600560248201526423a998191960d91b6044820152606490fd5b6126e1565b909192939450600181145f1461212a575050506001600160a01b03908116919086168214158061210c575b15611f595760405162461bcd60e51b8152602060048201526005602482015264475330323560d81b6044820152606490fd5b50815f52600860205260405f20835f5260205260405f2054156120da565b91939250906002810361223d57506001600160a01b03169161214b886125db565b81106120aa5760808101808211611e3d5781811061006f5785511061221057840160208101516040808301516060840180516080909501519290206001600160a01b0316861480159491906121d1575b5050505015611f595760405162461bcd60e51b815260206004820152600560248201526408ea66064760db1b6044820152606490fd5b60209450915f939160a093604051938a8552878501526040840152606083015260808201526101005afa60015f511460203d141616155f80808061219b565b60405162461bcd60e51b8152602060048201526005602482015264475330323760d81b6044820152606490fd5b919290601e8311156122e25760405160208101907f19457468657265756d205369676e6564204d6573736167653a0a333200000000825286603c820152603c8152612289605c82611cd9565b519020926003198101908111611e3d576122cc5f9360ff936020966040519586951690859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa15611733575f5190611f59565b6020926122cc5f9360405193849389859094939260ff6060936080840197845216602083015260408201520152565b60405162461bcd60e51b8152602060048201526005602482015264047533032360dc1b6044820152606490fd5b6001600160a01b031660018114159081612356575090565b5f908152600160205260409020546001600160a01b03161515919050565b908060209392818452848401375f828201840152601f01601f1916010190565b9060028210156123a15752565b634e487b7160e01b5f52602160045260245ffd5b81156123bf570490565b634e487b7160e01b5f52601260045260245ffd5b9060208201809211611e3d57565b91908201809211611e3d57565b6001600160401b038111611cfa5760051b60200190565b9061240f826123ee565b61241c6040519182611cd9565b828152809261242d601f19916123ee565b0190602036910137565b805182101561244b5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b95601e999397919560429b959993996124a960606040517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921881524660208201523060408201522090565b99806040519c8d378b207fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d88c5260208c01998a5260408c0198895260608c015260808b015260a08a015260c089015260e088015261010087015261012086015261014085015261016084209052611901835252012090565b9081602091031261006f5751801515810361006f5790565b9160045491821561254f5761254d93611e51565b565b60405162461bcd60e51b8152602060048201526005602482015264475330303160d81b6044820152606490fd5b30330361258557565b60405162461bcd60e51b8152602060048201526005602482015264475330333160d81b6044820152606490fd5b6125bb81612bcd565b6001600160a01b039081165f9081526002602052604090205416610ec957565b8015612604576041810290808204604103611e3d576125fc604191836123b5565b0361006f5790565b505f90565b90811561262757808202918083048203611e3d576125fc90836123b5565b50505f90565b60405162461bcd60e51b8152602060048201526005602482015264475332303160d81b6044820152606490fd5b60405162461bcd60e51b815260206004820152600560248201526423a999181960d91b6044820152606490fd5b60405162461bcd60e51b8152602060048201526005602482015264475331303160d81b6044820152606490fd5b60405162461bcd60e51b815260206004820152600560248201526411d4cc8c0d60da1b6044820152606490fd5b60405162461bcd60e51b8152602060048201526005602482015264475330323160d81b6044820152606490fd5b60405162461bcd60e51b815260206004820152600560248201526423a998189960d91b6044820152606490fd5b60405162461bcd60e51b8152602060048201526005602482015264475330313160d81b6044820152606490fd5b92919390935f927fb648d3644f584ed1c2232d53c46d87e693586486ad0d1175f8656013110b714e6040519533875260018060a01b03169586602082015287604082015260a06060820152806127c160a0820186611dcf565b6127ce6080830186612394565b0390a17fb104e0b93118902c651344349b610029d694cfdec91c589c91ebafbcd028994754956001331480156128e7575b6128ba576001600160a01b038716918261281d575b50505050909150565b61285a9550602094965f916128656040519889978896879563394614b960e11b87526004870152602486015260a0604486015260a4850190611dcf565b916064840190612394565b33608483015203925af1908115611733575f91612888575b50815f808080612814565b90506020813d6020116128b2575b816128a360209383611cd9565b8101031261006f57515f61287d565b3d9150612896565b60405162461bcd60e51b815260206004820152600560248201526411d4cc4c0d60da1b6044820152606490fd5b50335f908152600160205260409020546001600160a01b0316156127ff565b9291909260028310156123a1575f93849360010361292c5750602082519201908319f490565b602083519301918419f190565b5f9291906001600160a01b0316806129a1575b50501561297a577f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8339180a2565b7facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375339180a2565b803b1561006f576040516315661bd560e11b8152600481019290925282151560248301525f908290604490829084905af18015611733576129e3575b8061294c565b6129f09192505f90611cd9565b5f905f6129dd565b9092915f906001600160a01b038116612b0c575032935b6001600160a01b038116612a94575080612a8057505f8080612a3e81943a600110831461150957600190612609565b9586906001600160a01b03165af13d15612a7b573d612a5c81611d0e565b90612a6a6040519283611cd9565b81525f60203d92013e5b156114ff57565b612a74565b634e487b7160e01b81526011600452602490fd5b5f9150612aa46001602094612609565b94826040518581019263a9059cbb60e01b845260018060a01b0316602482015287604482015260448152612ad9606482611cd9565b519261270f195a01f13d8015612b0657602014612afa57505f5b1561158d57565b5f511590151715612af3565b50612af3565b93612a0f565b6001600160a01b0381163014612b46577f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b60405162461bcd60e51b8152602060048201526005602482015264047533430360dc1b6044820152606490fd5b612b7c82612bcd565b6001600160a01b039081165f908152600260205260409020548116911603612ba057565b60405162461bcd60e51b8152602060048201526005602482015264475332303560d81b6044820152606490fd5b6001600160a01b03168015908115612c42575b8115612c1b575b50612bee57565b60405162461bcd60e51b8152602060048201526005602482015264475332303360d81b6044820152606490fd5b9050301480612c2b575b5f612be7565b5060035f80303c62ef01005f5160e81c1415612c25565b600181149150612be056fea2646970667358221220c1114d9aa4b7a7f19850aedf1a39ad34ffb20a01878b281036c41efd5f914aa664736f6c634300081f0033 |