diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9a7b71c --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +PRIVATE_KEY= +RPC_URL= +API_KEY= diff --git a/broadcast/DeployVaultFactory.s.sol/84532/run-1738995389.json b/broadcast/DeployVaultFactory.s.sol/84532/run-1738995389.json new file mode 100644 index 0000000..d7f41ee --- /dev/null +++ b/broadcast/DeployVaultFactory.s.sol/84532/run-1738995389.json @@ -0,0 +1,57 @@ +{ + "transactions": [ + { + "hash": "0xd7d8b6b49ed2f2cef74c7856ab4f6a5cc0ef0594517044c8ef0b992f02eef83e", + "transactionType": "CREATE", + "contractName": "VaultFactory", + "contractAddress": "0xfd78bf33198991c386ac84d9c4b6a027ff767c26", + "function": null, + "arguments": null, + "transaction": { + "from": "0x7e393441edc1bb1621318e000cdfc74947f23b26", + "gas": "0x4c2b05", + "value": "0x0", + "input": "0x6080604052600c805462ff00ff19166201000117905534801561002157600080fd5b506101546040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810191909152506040805161012081018252734200000000000000000000000000000000000006815273036cbd53842c5426634e7929541ec2318f3dcf7e602082015273fe45bf4def7223ab1bf83ca17a4462ef1647f7ff9181019190915273571621ce60cebb0c1d442b5afb38b1663c6bf0176060820152734752ba5dbc23f44d87826276bf6fd6b1c372ad2460808201527394cc0aac535ccdb3c01d6787d6413c739ae12bc460a082015273c5290058841028f1614f3a6f0f5816cad0df5e2760c082015273be781d7bdf469f3d94a62cdcc407ace106aeca7460e0820152604d61010082015290565b8051600e80546001600160a01b03199081166001600160a01b03938416179091556020830151600f8054831691841691909117905560408301516010805483169184169190911790556060830151601180548316918416919091179055608083015160128054831691841691909117905560a083015160138054831691841691909117905560c083015160148054831691841691909117905560e083015160158054831691841691909117905561010090920151601680549093169116179055614065806102236000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c806365cacaa41161006657806365cacaa41461017b578063989e6fd914610199578063d1a43bda146101a1578063d7b65745146101a9578063f8ccbf471461024757600080fd5b806347ae49e714610098578063522c441d1461012a57806358f67476146101325780635d12928b14610173575b600080fd5b6100a061026a565b604051610121919081516001600160a01b03908116825260208084015182169083015260408084015182169083015260608084015182169083015260808084015182169083015260a08084015182169083015260c08084015182169083015260e0808401518216908301526101009283015116918101919091526101200190565b60405180910390f35b6100a06102fb565b61015b6101403660046106c0565b600d602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610121565b61015b61039d565b336000908152600d60205260409020546001600160a01b031661015b565b6100a0610488565b6100a061051b565b600e54600f546010546011546012546013546014546015546016546101ed986001600160a01b03908116988116978116968116958116948116938116928116911689565b604080516001600160a01b039a8b168152988a1660208a01529689169688019690965293871660608701529186166080860152851660a0850152841660c0840152831660e083015290911661010082015261012001610121565b600c5461025a9062010000900460ff1681565b6040519015158152602001610121565b610272610667565b5060408051610120810182526000808252735425890298aed601595a70ab815c96711a31bc656020830152739cfcc1b289e59fbe1e769f020c77315df847376092820192909252606081018290526080810182905260a0810182905260c0810191909152738b9b2af4afb389b4a70a474dfd4adcd4a302bb4060e0820152604d61010082015290565b610303610667565b50604080516101208101825273c558dbdd856501fcd9aaf1e62eae57a9f0629a3c81527394a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c86020820152600091810182905273e3e0106227181958abfba960c13d0fe52c73326560608201526080810182905260a0810182905260c0810191909152736ae43d3271ff6888e7fc43fd7321a503ff73895160e0820152604d61010082015290565b601654601554601154601354601254604051600095869533956001600160a01b039283169591831694908316939183169216906103d9906106b3565b6001600160a01b0396871681529486166020860152928516604085015290841660608401528316608083015290911660a082015260c001604051809103906000f08015801561042c573d6000803e3d6000fd5b50336000818152600d602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051939450927f5d9c31ffa0fecffd7cf379989a3c7af252f0335e0d2a1320b55245912c781f539190a3919050565b610490610667565b6104ce6040518060400160405280601881526020017f54657374696e67204f6e20416e76696c204e6574776f726b00000000000000008152506105fc565b506040805161012081018252600080825260016020830152918101829052606081019190915260026080820152600360a0820152600660c0820152600760e0820152604d61010082015290565b610523610667565b5060408051610120810182526006602160991b01815273036cbd53842c5426634e7929541ec2318f3dcf7e602082015273fe45bf4def7223ab1bf83ca17a4462ef1647f7ff9181019190915273571621ce60cebb0c1d442b5afb38b1663c6bf0176060820152734752ba5dbc23f44d87826276bf6fd6b1c372ad2460808201527394cc0aac535ccdb3c01d6787d6413c739ae12bc460a082015273c5290058841028f1614f3a6f0f5816cad0df5e2760c082015273be781d7bdf469f3d94a62cdcc407ace106aeca7460e0820152604d61010082015290565b61063f8160405160240161061091906106f0565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052610642565b50565b61063f8160006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6138f08061074083390190565b6000602082840312156106d257600080fd5b81356001600160a01b03811681146106e957600080fd5b9392505050565b60006020808352835180602085015260005b8181101561071e57858101830151858201604001528201610702565b506000604082860101526040601f19601f830116850101925050509291505056fe60c06040523480156200001157600080fd5b50604051620038f0380380620038f0833981016040819052620000349162000139565b83838383896001600160a01b0381166200006857604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200007381620000cc565b50600180546001600160a01b039586166001600160a01b0319918216179091556002805494861694821694909417909355908316608052821660a052600380549790921696169590951790945550620001ba9350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200013457600080fd5b919050565b60008060008060008060c087890312156200015357600080fd5b6200015e876200011c565b95506200016e602088016200011c565b94506200017e604088016200011c565b93506200018e606088016200011c565b92506200019e608088016200011c565b9150620001ae60a088016200011c565b90509295509295509295565b60805160a0516136e66200020a60003960008181610289015281816104900152818161200d01526123da01526000818161024a015281816117c7015281816118ef015261198a01526136e66000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063a03e4bc3116100b8578063ca11615e1161007c578063ca11615e1461032e578063dc06618014610341578063e6e1bdec146103bb578063e8f6daa9146103c3578063f2fde38b146103d6578063f5ff5c76146103e957600080fd5b8063a03e4bc3146102cf578063a1db9782146102e2578063aab76479146102f5578063bcf685ed14610308578063c7d716d71461031b57600080fd5b8063715018a6116100ff578063715018a61461023d578063735de9f7146102455780638bdb2afa146102845780638da5cb5b146102ab57806397feb926146102bc57600080fd5b806321db82401461013c5780634a0de08f14610176578063592bac55146101ae5780635d631152146101cf5780635db8083e146101e4575b600080fd5b6101446103fc565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0015b60405180910390f35b610189610184366004612e1c565b610488565b604080516001600160801b03909416845260208401929092529082015260600161016d565b6101c16101bc366004612e63565b6106d9565b60405190815260200161016d565b6101e26101dd366004612f57565b6107bd565b005b6101f76101f2366004612fb1565b610a1f565b60405161016d919081516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080918201519181019190915260a00190565b6101e2610ab3565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161016d565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031661026c565b6101e26102ca366004612fce565b610ac7565b60015461026c906001600160a01b031681565b6101e26102f0366004612fce565b610cb5565b6101c1610303366004612f57565b610ecb565b6101e2610316366004612fb1565b6111d7565b6101e2610329366004613009565b611201565b6101e261033c3660046130b7565b61154f565b61038961034f366004612fb1565b6004602081905260009182526040909120805460018201546002830154600384015493909401546001600160a01b03909216939092909185565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00161016d565b6101c1611700565b60025461026c906001600160a01b031681565b6101e26103e4366004612fb1565b611772565b60035461026c906001600160a01b031681565b600154604051632fe4a15f60e21b8152306004820152600091829182918291829182916001600160a01b039091169063bf92857c9060240160c060405180830381865afa158015610451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104759190613121565b949b939a50919850965094509092509050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828888886040518463ffffffff1660e01b81526004016104de9392919061316b565b602060405180830381865afa1580156104fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051f9190613193565b90506001600160a01b0381166105505760405162461bcd60e51b8152600401610547906131b0565b60405180910390fd5b600080876001600160a01b0316896001600160a01b031610610573578789610576565b88885b91509150600080846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa1580156105bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105df91906131fe565b50505050509150915060006064826105f791906132a7565b905060006106068360646132d2565b6040516bffffffffffffffffffffffff193060601b16602082015260e884811b603483015282901b60378201529091506001600160a01b0388169063514ea4bf90603a01604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161067e91815260200190565b60a060405180830381865afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf919061330e565b50929c50909a509850505050505050505093509350939050565b6003546000906001600160a01b031633146107065760405162461bcd60e51b815260040161054790613365565b6001600160a01b0385166000908152600460205260409020600101548311156107415760405162461bcd60e51b815260040161054790613389565b61074f8585856001866117b0565b6001600160a01b03861660009081526004602052604081206001018054929350859290919061077f9084906133b7565b90915550506001600160a01b038416600090815260046020526040812060010180548392906107af9084906133ca565b909155509095945050505050565b6003546001600160a01b031633146107e75760405162461bcd60e51b815260040161054790613365565b6040805180820190915260048152636161766560e01b60209182015283519084012083907fe0a39fef8aa5887c76606e7a14a5db8dc6676191e4866b2a609a3aa003b183291480159061087f575060408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528151908201207f2b05eae252b2d830081b9362c105fc1b4e5f974a0c53bee02c06419c2f4a117e14155b1561089f57806040516303622bc560e21b81526004016105479190613423565b6001600160a01b0383166000908152600460205260409020600101548211156108da5760405162461bcd60e51b815260040161054790613389565b6040805180820190915260048152636161766560e01b6020918201528451908501207f1f5c6010755a7783899f9185eb5a247239989e6e1b7994d59f65c55ffc4e7cd7016109625761092c83836119e2565b6001600160a01b038316600090815260046020526040812060020180548492906109579084906133ca565b909155506109e99050565b60408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528451908501207fd4fa151dad4d27cff7e46c9d3efa03e4b1a068b5f3ac411fd3f9be63d0b5ee82016109e9576109b88383611b6b565b6001600160a01b038316600090815260046020526040812060030180548492906109e39084906133ca565b90915550505b6001600160a01b03831660009081526004602052604081206001018054849290610a149084906133b7565b909155505050505050565b610a5a6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b506001600160a01b03908116600090815260046020818152604092839020835160a08101855281549095168552600181015491850191909152600281015492840192909252600382015460608401520154608082015290565b610abb611cdf565b610ac56000611d0c565b565b610acf611cdf565b604051636eb1769f60e11b815233600482015230602482015281906001600160a01b0384169063dd62ed3e90604401602060405180830381865afa158015610b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3f9190613436565b1015610b865760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610547565b6040516323b872dd60e01b8152336004820152306024820152604481018290526000906001600160a01b038416906323b872dd906064016020604051808303816000875af1158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c00919061344f565b905080610c415760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610547565b6001600160a01b03831660009081526004602052604081206001018054849290610c6c9084906133ca565b90915550506040518281526001600160a01b038416907fab79632de7fe1724598ce2214eaa326d90d48064d2d3397406ecc5769316a5f6906020015b60405180910390a2505050565b610cbd611cdf565b6001600160a01b038216600090815260046020526040902060010154811115610cf85760405162461bcd60e51b815260040161054790613389565b816001600160a01b031663095ea7b3610d196000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a919061344f565b506000826001600160a01b031663a9059cbb610dae6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f919061344f565b905080610e605760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610547565b6001600160a01b03831660009081526004602052604081206001018054849290610e8b9084906133b7565b90915550506040518281526001600160a01b038416907f7e2c99819371db0a6fc6f4269fe872496e44f502df19ba3eae594b7a1598746090602001610ca8565b6003546000906001600160a01b03163314610ef85760405162461bcd60e51b815260040161054790613365565b6040805180820190915260048152636161766560e01b60209182015284519085012084907fe0a39fef8aa5887c76606e7a14a5db8dc6676191e4866b2a609a3aa003b1832914801590610f90575060408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528151908201207f2b05eae252b2d830081b9362c105fc1b4e5f974a0c53bee02c06419c2f4a117e14155b15610fb057806040516303622bc560e21b81526004016105479190613423565b6040805180820190915260048152636161766560e01b6020918201528551908601207f1f5c6010755a7783899f9185eb5a247239989e6e1b7994d59f65c55ffc4e7cd7016110a8576001600160a01b0384166000908152600460205260409020600201548311156110635760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420696e76657374656420616d6f756e74000000006044820152606401610547565b61106d8484611d5c565b6001600160a01b03851660009081526004602052604081206002018054929450859290919061109d9084906133b7565b9091555061119f9050565b60408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528551908601207fd4fa151dad4d27cff7e46c9d3efa03e4b1a068b5f3ac411fd3f9be63d0b5ee820161119f576001600160a01b03841660009081526004602052604090206003015483111561115f5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420696e76657374656420616d6f756e74000000006044820152606401610547565b6111698484611e4d565b6001600160a01b0385166000908152600460205260408120600301805492945085929091906111999084906133b7565b90915550505b6001600160a01b038416600090815260046020526040812060010180548492906111ca9084906133ca565b9091555050509392505050565b6111df611cdf565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b0316331461122b5760405162461bcd60e51b815260040161054790613365565b6040805180820190915260078152660756e69737761760cc1b60209182015288519089012088907fa2a03459171c76bff45817330c10ef9f8af07011a33005b73b50189bbc7e7132148015906112c757506040805180820190915260098152686165726f64726f6d6560b81b6020918201528151908201207fc570e6c17f57bc6841b1057f94fcf1785f440006714dbd98f64d859b54cd25d314155b156112e757806040516303622bc560e21b81526004016105479190613423565b6001600160a01b0388166000908152600460205260409020600101548611156113525760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742062616c616e636520746f6b656e3000000000006044820152606401610547565b6001600160a01b0387166000908152600460205260409020600101548511156113bd5760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742062616c616e636520746f6b656e3100000000006044820152606401610547565b6040805180820190915260078152660756e69737761760cc1b6020918201528951908a01207f5d5fcba6e8e389400ba7e8ccf3ef1060750f8fee5ccffa48c4afe76443818ece0161147e5761141788888888888888612008565b506001600160a01b038816600090815260046020819052604082200180548892906114439084906133ca565b90915550506001600160a01b038716600090815260046020819052604082200180548792906114739084906133ca565b909155506114e49050565b6040805180820190915260098152686165726f64726f6d6560b81b6020918201528951908a01207f3a8f193e80a84397be4efa806b030e87a0bbfff98eb2426709b27a64ab32da2d016114e4576040516305fcd0f760e01b815260040160405180910390fd5b6001600160a01b0388166000908152600460205260408120600101805488929061150f9084906133b7565b90915550506001600160a01b0387166000908152600460205260408120600101805487929061153f9084906133b7565b9091555050505050505050505050565b6003546001600160a01b031633146115795760405162461bcd60e51b815260040161054790613365565b6040805180820190915260078152660756e69737761760cc1b60209182015284519085012084907fa2a03459171c76bff45817330c10ef9f8af07011a33005b73b50189bbc7e71321480159061161557506040805180820190915260098152686165726f64726f6d6560b81b6020918201528151908201207fc570e6c17f57bc6841b1057f94fcf1785f440006714dbd98f64d859b54cd25d314155b1561163557806040516303622bc560e21b81526004016105479190613423565b6040805180820190915260078152660756e69737761760cc1b6020918201528551908601207f5d5fcba6e8e389400ba7e8ccf3ef1060750f8fee5ccffa48c4afe76443818ece016116935761168e8484610bb8856123c0565b6116f9565b6040805180820190915260098152686165726f64726f6d6560b81b6020918201528551908601207f3a8f193e80a84397be4efa806b030e87a0bbfff98eb2426709b27a64ab32da2d016116f9576040516305fcd0f760e01b815260040160405180910390fd5b5050505050565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176d9190613436565b905090565b61177a611cdf565b6001600160a01b0381166117a457604051631e4fbdf760e01b815260006004820152602401610547565b6117ad81611d0c565b50565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590526000919087169063095ea7b3906044016020604051808303816000875af1158015611823573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611847919061344f565b5060408051610100810182526001600160a01b0388811682528781166020830190815262ffffff8681168486019081523060608601908152426080870190815260a087018c815260c088018c8152600060e08a01908152995163414bf38960e01b815289518916600482015296518816602488015293519094166044860152905185166064850152516084840152905160a48301525160c48201529251811660e484015290917f00000000000000000000000000000000000000000000000000000000000000009091169063414bf38990610104016020604051808303816000875af115801561193b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195f9190613436565b604080516001600160a01b038a811682528981166020830152918101889052606081018390529193507f000000000000000000000000000000000000000000000000000000000000000016907fad56699d0f375866eb895ed27203058a36a713382aaded78eb6b67da266d43329060800160405180910390a25095945050505050565b60015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905260009184169063095ea7b3906044016020604051808303816000875af1158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b919061344f565b905080611aba5760405162461bcd60e51b815260206004820152602760248201527f417070726f76616c206f6620617373657420696e746f204161766520706f6f6c6044820152660819985a5b195960ca1b6064820152608401610547565b60015460405163617ba03760e01b81526001600160a01b03858116600483015260248201859052306044830152600060648301529091169063617ba03790608401600060405180830381600087803b158015611b1557600080fd5b505af1158015611b29573d6000803e3d6000fd5b505050507f76bfb501e0568602c59c0cffcde817c5bc2696480830199d9f8c115afe02c54e8383604051611b5e92919061346a565b60405180910390a1505050565b60025460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905260009184169063095ea7b3906044016020604051808303816000875af1158015611bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be4919061344f565b905080611c425760405162461bcd60e51b815260206004820152602660248201527f417070726f76616c206f6620617373657420696e746f20436f6d706f756e642060448201526519985a5b195960d21b6064820152608401610547565b600254604051634232cd6360e01b81523060048201526001600160a01b0385811660248301526044820185905290911690634232cd6390606401600060405180830381600087803b158015611c9657600080fd5b505af1158015611caa573d6000803e3d6000fd5b505050507f76bfb501e0568602c59c0cffcde817c5bc2696480830199d9f8c115afe02c54e8383604051611b5e92919061349e565b6000546001600160a01b03163314610ac55760405163118cdaa760e01b8152336004820152602401610547565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080611d676103fc565b5050505050905082811015611d8e5760405162461bcd60e51b8152600401610547906134d6565b600154604051631a4ca37b60e21b81526001600160a01b03868116600483015260248201869052306044830152909116906369328dec906064016020604051808303816000875af1158015611de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0b9190613436565b91507ff2119ac293790f480d31afd7d613930c9e10d9432d0dedb82738f50368fa27b58484604051611e3e92919061346a565b60405180910390a15092915050565b600080611e58611700565b905082811015611e7a5760405162461bcd60e51b8152600401610547906134d6565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa158015611ec1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee59190613436565b60025460405163f3fef3a360e01b81526001600160a01b0388811660048301526024820188905292935091169063f3fef3a390604401600060405180830381600087803b158015611f3557600080fd5b505af1158015611f49573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03881691506370a0823190602401602060405180830381865afa158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb89190613436565b9050611fc482826133b7565b93507ff2119ac293790f480d31afd7d613930c9e10d9432d0dedb82738f50368fa27b58685604051611ff792919061349e565b60405180910390a150505092915050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828a8a886040518463ffffffff1660e01b815260040161205b9392919061316b565b602060405180830381865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190613193565b90506001600160a01b0381166120c45760405162461bcd60e51b8152600401610547906131b0565b600080896001600160a01b03168b6001600160a01b0316106120e757898b6120ea565b8a8a5b915091506000826001600160a01b03168c6001600160a01b03161461210f5788612111565b895b90506000836001600160a01b03168d6001600160a01b031614612134578a612136565b895b60405163095ea7b360e01b81526001600160a01b038781166004830152602482018590529192509085169063095ea7b3906044016020604051808303816000875af1158015612189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ad919061344f565b5060405163095ea7b360e01b81526001600160a01b0386811660048301526024820183905284169063095ea7b3906044016020604051808303816000875af11580156121fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612221919061344f565b506000856001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa158015612262573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228691906131fe565b505050505050905060006122998a6126af565b905060006122a68a6126af565b90506122b58383838888612af1565b9850600080896001600160a01b0316633c8a7d8d308f8f8f306040516020016122ed91906001600160a01b0391909116815260200190565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161231c959493929190613518565b60408051808303816000875af115801561233a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235e9190613565565b91509150896001600160a01b03167fce0669c03a6bebf1a7a80046c110092cafdff0bb527ff2e4ea213faf8f07cf118a8a8e86866040516123a3959493929190613589565b60405180910390a250505050505050505050979650505050505050565b604051630b4c774160e11b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631698ee82906124139088908890889060040161316b565b602060405180830381865afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124549190613193565b90506001600160a01b03811661247c5760405162461bcd60e51b8152600401610547906131b0565b600080856001600160a01b0316876001600160a01b03161061249f5785876124a2565b86865b91509150600080846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa1580156124e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250b91906131fe565b505050505091509150600060648261252391906132a7565b905060006125328360646132d2565b60405163a34123a760e01b8152600284810b600483015282900b60248201526001600160801b038a16604482015290915060009081906001600160a01b038a169063a34123a79060640160408051808303816000875af115801561259a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125be9190613565565b6040516309e3d67b60e31b8152306004820152600287810b602483015286900b60448201526001600160801b0380841660648301528216608482015291935091506001600160a01b038a1690634f1eb3d89060a40160408051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265591906135c3565b5050886001600160a01b03167ff0c5c8e0b584b9430fbe397d62831fc7eca3e734a39a08659847de97469501de89898d8686604051612698959493929190613589565b60405180910390a250505050505050505050505050565b6000620d89e719600283900b128015906126db57506126d1620d89e7196135f6565b60020b8260020b13155b6127165760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207469636b60a01b6044820152606401610547565b6000808360020b1261272b578260020b612738565b8260020b61273890613618565b905060008160011660000361275157600160801b612763565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156127a257608061279d826ffff97272373d413259a46990580e213a613634565b901c90505b60048216156127cc5760806127c7826ffff2e50f5f656932ef12357cf3c7fdcc613634565b901c90505b60088216156127f65760806127f1826fffe5caca7e10e4e61c3624eaa0941cd0613634565b901c90505b601082161561282057608061281b826fffcb9843d60f6159c9db58835c926644613634565b901c90505b602082161561284a576080612845826fff973b41fa98c081472e6896dfb254c0613634565b901c90505b604082161561287457608061286f826fff2ea16466c96a3843ec78b326b52861613634565b901c90505b608082161561289e576080612899826ffe5dee046a99a2a811c461f1969c3053613634565b901c90505b6101008216156128c95760806128c4826ffcbe86c7900a88aedcffc83b479aa3a4613634565b901c90505b6102008216156128f45760806128ef826ff987a7253ac413176f2b074cf7815e54613634565b901c90505b61040082161561291f57608061291a826ff3392b0822b70005940c7a398e4b70f3613634565b901c90505b61080082161561294a576080612945826fe7159475a2c29b7443b29c7fa6e889d9613634565b901c90505b611000821615612975576080612970826fd097f3bdfd2022b8845ad8f792aa5825613634565b901c90505b6120008216156129a057608061299b826fa9f746462d870fdf8a65dc1f90e061e5613634565b901c90505b6140008216156129cb5760806129c6826f70d869a156d2a1b890bb3df62baf32f7613634565b901c90505b6180008216156129f65760806129f1826f31be135f97d08fd981231505542fcfa6613634565b901c90505b62010000821615612a22576080612a1d826f09aa508b5b7a84e1c677de54f3e99bc9613634565b901c90505b62020000821615612a4d576080612a48826e5d6af8dedb81196699c329225ee604613634565b901c90505b62040000821615612a77576080612a72826d2216e584f5fa1ea926041bedfe98613634565b901c90505b62080000821615612a9f576080612a9a826b048a170391f7dc42444e8fa2613634565b901c90505b60008460020b1315612aba57612ab781600019613661565b90505b612ac964010000000082613675565b15612ad5576001612ad8565b60005b612ae99060ff16602083901c6133ca565b949350505050565b6000836001600160a01b0316856001600160a01b03161115612b11579293925b846001600160a01b0316866001600160a01b031611612b3c57612b35858585612bb5565b9050612bac565b836001600160a01b0316866001600160a01b03161015612b9e576000612b63878686612bb5565b90506000612b72878986612c2a565b9050806001600160801b0316826001600160801b031610612b935780612b95565b815b92505050612bac565b612ba9858584612c2a565b90505b95945050505050565b6000826001600160a01b0316846001600160a01b03161115612bd5579192915b6000612bf8856001600160a01b0316856001600160a01b0316600160601b612c60565b9050612c1f612c1a8483612c0c8989613689565b6001600160a01b0316612c60565b612dd9565b9150505b9392505050565b6000826001600160a01b0316846001600160a01b03161115612c4a579192915b612ae9612c1a83600160601b612c0c8888613689565b6000808060001985870985870292508281108382030391505080600003612c995760008411612c8e57600080fd5b508290049050612c23565b808411612ca557600080fd5b6000848688098084039381119092039190506000612cc5861960016133ca565b8616958690049593849004936000819003046001019050612ce68184613634565b909317926000612cf7876003613634565b6002189050612d068188613634565b612d119060026133b7565b612d1b9082613634565b9050612d278188613634565b612d329060026133b7565b612d3c9082613634565b9050612d488188613634565b612d539060026133b7565b612d5d9082613634565b9050612d698188613634565b612d749060026133b7565b612d7e9082613634565b9050612d8a8188613634565b612d959060026133b7565b612d9f9082613634565b9050612dab8188613634565b612db69060026133b7565b612dc09082613634565b9050612dcc8186613634565b9998505050505050505050565b806001600160801b0381168114612def57600080fd5b919050565b6001600160a01b03811681146117ad57600080fd5b803562ffffff81168114612def57600080fd5b600080600060608486031215612e3157600080fd5b8335612e3c81612df4565b92506020840135612e4c81612df4565b9150612e5a60408501612e09565b90509250925092565b60008060008060808587031215612e7957600080fd5b8435612e8481612df4565b93506020850135612e9481612df4565b925060408501359150612ea960608601612e09565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612edb57600080fd5b813567ffffffffffffffff80821115612ef657612ef6612eb4565b604051601f8301601f19908116603f01168101908282118183101715612f1e57612f1e612eb4565b81604052838152866020858801011115612f3757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612f6c57600080fd5b833567ffffffffffffffff811115612f8357600080fd5b612f8f86828701612eca565b9350506020840135612fa081612df4565b929592945050506040919091013590565b600060208284031215612fc357600080fd5b8135612c2381612df4565b60008060408385031215612fe157600080fd5b8235612fec81612df4565b946020939093013593505050565b8060020b81146117ad57600080fd5b600080600080600080600080610100898b03121561302657600080fd5b883567ffffffffffffffff81111561303d57600080fd5b6130498b828c01612eca565b985050602089013561305a81612df4565b9650604089013561306a81612df4565b9550606089013594506080890135935061308660a08a01612e09565b925060c089013561309681612ffa565b915060e08901356130a681612ffa565b809150509295985092959890939650565b600080600080608085870312156130cd57600080fd5b843567ffffffffffffffff8111156130e457600080fd5b6130f087828801612eca565b945050602085013561310181612df4565b9250604085013561311181612df4565b9396929550929360600135925050565b60008060008060008060c0878903121561313a57600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6000602082840312156131a557600080fd5b8151612c2381612df4565b602080825260129082015271141bdbdb08191bd95cdb89dd08195e1a5cdd60721b604082015260600190565b805161ffff81168114612def57600080fd5b80518015158114612def57600080fd5b600080600080600080600060e0888a03121561321957600080fd5b875161322481612df4565b602089015190975061323581612ffa565b9550613243604089016131dc565b9450613251606089016131dc565b935061325f608089016131dc565b925060a088015160ff8116811461327557600080fd5b915061328360c089016131ee565b905092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b600282810b9082900b03627fffff198112627fffff821317156132cc576132cc613291565b92915050565b600281810b9083900b01627fffff8113627fffff19821217156132cc576132cc613291565b80516001600160801b0381168114612def57600080fd5b600080600080600060a0868803121561332657600080fd5b61332f866132f7565b9450602086015193506040860151925061334b606087016132f7565b9150613359608087016132f7565b90509295509295909350565b6020808252600a908201526913db9b1e481859d95b9d60b21b604082015260600190565b602080825260149082015273496e73756666696369656e742062616c616e636560601b604082015260600190565b818103818111156132cc576132cc613291565b808201808211156132cc576132cc613291565b6000815180845260005b81811015613403576020818501810151868301820152016133e7565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612c2360208301846133dd565b60006020828403121561344857600080fd5b5051919050565b60006020828403121561346157600080fd5b612c23826131ee565b6060808252600490820152634161766560e01b60808201526001600160a01b03929092166020830152604082015260a00190565b60608082526008908201526710dbdb5c1bdd5b9960c21b60808201526001600160a01b03929092166020830152604082015260a00190565b60208082526022908201527f43616e6e6f74207769746864726177206d6f7265207468616e20626f72726f77604082015261195960f21b606082015260800190565b60018060a01b03861681528460020b60208201528360020b60408201526001600160801b038316606082015260a06080820152600061355a60a08301846133dd565b979650505050505050565b6000806040838503121561357857600080fd5b505080516020909101519092909150565b6001600160a01b0395861681529390941660208401526001600160801b039190911660408301526060820152608081019190915260a00190565b600080604083850312156135d657600080fd5b6135df836132f7565b91506135ed602084016132f7565b90509250929050565b60008160020b627fffff19810361360f5761360f613291565b60000392915050565b6000600160ff1b820161362d5761362d613291565b5060000390565b80820281158282048414176132cc576132cc613291565b634e487b7160e01b600052601260045260246000fd5b6000826136705761367061364b565b500490565b6000826136845761368461364b565b500690565b6001600160a01b038281168282160390808211156136a9576136a9613291565b509291505056fea2646970667358221220a3e658e993430ca9253841754cb27b4fca331c7c702af9bee59b01b0c2eccc4564736f6c63430008160033a2646970667358221220a12caa67632b2ded47b7266f2811822763dbd896ba715f086ad753613f2ce0d664736f6c63430008160033", + "nonce": "0x0", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xaaf983", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xd7d8b6b49ed2f2cef74c7856ab4f6a5cc0ef0594517044c8ef0b992f02eef83e", + "transactionIndex": "0x37", + "blockHash": "0x2822a250a9e6e5a5b1a0875f9615108f3eb29d71672a6c57f88f92af4e18a178", + "blockNumber": "0x149cbe4", + "gasUsed": "0x3a9b69", + "effectiveGasPrice": "0xdeea3", + "from": "0x7e393441edc1bb1621318e000cdfc74947f23b26", + "to": null, + "contractAddress": "0xfd78bf33198991c386ac84d9c4b6a027ff767c26", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x602793c298", + "l1GasPrice": "0xa9d00b39", + "l1GasUsed": "0x2024b" + } + ], + "libraries": [], + "pending": [], + "returns": { + "0": { + "internal_type": "contract VaultFactory", + "value": "0xfD78bF33198991C386ac84d9c4B6A027fF767c26" + } + }, + "timestamp": 1738995389, + "chain": 84532, + "commit": "9b55e2c" +} \ No newline at end of file diff --git a/broadcast/DeployVaultFactory.s.sol/84532/run-1738997609.json b/broadcast/DeployVaultFactory.s.sol/84532/run-1738997609.json new file mode 100644 index 0000000..66c62dd --- /dev/null +++ b/broadcast/DeployVaultFactory.s.sol/84532/run-1738997609.json @@ -0,0 +1,57 @@ +{ + "transactions": [ + { + "hash": "0x4bcd3ea0a755da46d20fa618e7b7aa1bfb335bcb161203df48bb164193235b0d", + "transactionType": "CREATE", + "contractName": "VaultFactory", + "contractAddress": "0xba31d235cf7f92f857fe891b630110efe1e47002", + "function": null, + "arguments": null, + "transaction": { + "from": "0x7e393441edc1bb1621318e000cdfc74947f23b26", + "gas": "0x4c3b79", + "value": "0x0", + "input": "0x6080604052600c805462ff00ff19166201000117905534801561002157600080fd5b506101546040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810191909152506040805161012081018252734200000000000000000000000000000000000006815273036cbd53842c5426634e7929541ec2318f3dcf7e602082015273fe45bf4def7223ab1bf83ca17a4462ef1647f7ff9181019190915273571621ce60cebb0c1d442b5afb38b1663c6bf0176060820152734752ba5dbc23f44d87826276bf6fd6b1c372ad2460808201527394cc0aac535ccdb3c01d6787d6413c739ae12bc460a082015273c5290058841028f1614f3a6f0f5816cad0df5e2760c082015273be781d7bdf469f3d94a62cdcc407ace106aeca7460e0820152604d61010082015290565b8051600e80546001600160a01b03199081166001600160a01b03938416179091556020830151600f8054831691841691909117905560408301516010805483169184169190911790556060830151601180548316918416919091179055608083015160128054831691841691909117905560a083015160138054831691841691909117905560c083015160148054831691841691909117905560e083015160158054831691841691909117905561010090920151601680549093169116179055614074806102236000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063989e6fd911610066578063989e6fd914610191578063b4bd6f4614610199578063d1a43bda146101ac578063d7b65745146101b4578063f8ccbf471461025257600080fd5b806347ae49e714610098578063522c441d1461012a57806358f674761461013257806365cacaa414610173575b600080fd5b6100a0610275565b604051610121919081516001600160a01b03908116825260208084015182169083015260408084015182169083015260608084015182169083015260808084015182169083015260a08084015182169083015260c08084015182169083015260e0808401518216908301526101009283015116918101919091526101200190565b60405180910390f35b6100a0610306565b61015b6101403660046106cf565b600d602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610121565b336000908152600d60205260409020546001600160a01b031661015b565b6100a06103a8565b61015b6101a73660046106cf565b61043b565b6100a061052a565b600e54600f546010546011546012546013546014546015546016546101f8986001600160a01b03908116988116978116968116958116948116938116928116911689565b604080516001600160a01b039a8b168152988a1660208a01529689169688019690965293871660608701529186166080860152851660a0850152841660c0840152831660e083015290911661010082015261012001610121565b600c546102659062010000900460ff1681565b6040519015158152602001610121565b61027d610676565b5060408051610120810182526000808252735425890298aed601595a70ab815c96711a31bc656020830152739cfcc1b289e59fbe1e769f020c77315df847376092820192909252606081018290526080810182905260a0810182905260c0810191909152738b9b2af4afb389b4a70a474dfd4adcd4a302bb4060e0820152604d61010082015290565b61030e610676565b50604080516101208101825273c558dbdd856501fcd9aaf1e62eae57a9f0629a3c81527394a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c86020820152600091810182905273e3e0106227181958abfba960c13d0fe52c73326560608201526080810182905260a0810182905260c0810191909152736ae43d3271ff6888e7fc43fd7321a503ff73895160e0820152604d61010082015290565b6103b0610676565b6103ee6040518060400160405280601881526020017f54657374696e67204f6e20416e76696c204e6574776f726b000000000000000081525061060b565b506040805161012081018252600080825260016020830152918101829052606081019190915260026080820152600360a0820152600660c0820152600760e0820152604d61010082015290565b601654601554601154601354601254604051600095869588956001600160a01b03928316959183169490831693918316921690610477906106c2565b6001600160a01b0396871681529486166020860152928516604085015290841660608401528316608083015290911660a082015260c001604051809103906000f0801580156104ca573d6000803e3d6000fd5b506001600160a01b038481166000818152600d602052604080822080546001600160a01b031916948616948517905551939450919290917f5d9c31ffa0fecffd7cf379989a3c7af252f0335e0d2a1320b55245912c781f5391a392915050565b610532610676565b5060408051610120810182526006602160991b01815273036cbd53842c5426634e7929541ec2318f3dcf7e602082015273fe45bf4def7223ab1bf83ca17a4462ef1647f7ff9181019190915273571621ce60cebb0c1d442b5afb38b1663c6bf0176060820152734752ba5dbc23f44d87826276bf6fd6b1c372ad2460808201527394cc0aac535ccdb3c01d6787d6413c739ae12bc460a082015273c5290058841028f1614f3a6f0f5816cad0df5e2760c082015273be781d7bdf469f3d94a62cdcc407ace106aeca7460e0820152604d61010082015290565b61064e8160405160240161061f91906106ff565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052610651565b50565b61064e8160006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6138f08061074f83390190565b6000602082840312156106e157600080fd5b81356001600160a01b03811681146106f857600080fd5b9392505050565b60006020808352835180602085015260005b8181101561072d57858101830151858201604001528201610711565b506000604082860101526040601f19601f830116850101925050509291505056fe60c06040523480156200001157600080fd5b50604051620038f0380380620038f0833981016040819052620000349162000139565b83838383896001600160a01b0381166200006857604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200007381620000cc565b50600180546001600160a01b039586166001600160a01b0319918216179091556002805494861694821694909417909355908316608052821660a052600380549790921696169590951790945550620001ba9350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200013457600080fd5b919050565b60008060008060008060c087890312156200015357600080fd5b6200015e876200011c565b95506200016e602088016200011c565b94506200017e604088016200011c565b93506200018e606088016200011c565b92506200019e608088016200011c565b9150620001ae60a088016200011c565b90509295509295509295565b60805160a0516136e66200020a60003960008181610289015281816104900152818161200d01526123da01526000818161024a015281816117c7015281816118ef015261198a01526136e66000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063a03e4bc3116100b8578063ca11615e1161007c578063ca11615e1461032e578063dc06618014610341578063e6e1bdec146103bb578063e8f6daa9146103c3578063f2fde38b146103d6578063f5ff5c76146103e957600080fd5b8063a03e4bc3146102cf578063a1db9782146102e2578063aab76479146102f5578063bcf685ed14610308578063c7d716d71461031b57600080fd5b8063715018a6116100ff578063715018a61461023d578063735de9f7146102455780638bdb2afa146102845780638da5cb5b146102ab57806397feb926146102bc57600080fd5b806321db82401461013c5780634a0de08f14610176578063592bac55146101ae5780635d631152146101cf5780635db8083e146101e4575b600080fd5b6101446103fc565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0015b60405180910390f35b610189610184366004612e1c565b610488565b604080516001600160801b03909416845260208401929092529082015260600161016d565b6101c16101bc366004612e63565b6106d9565b60405190815260200161016d565b6101e26101dd366004612f57565b6107bd565b005b6101f76101f2366004612fb1565b610a1f565b60405161016d919081516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080918201519181019190915260a00190565b6101e2610ab3565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161016d565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031661026c565b6101e26102ca366004612fce565b610ac7565b60015461026c906001600160a01b031681565b6101e26102f0366004612fce565b610cb5565b6101c1610303366004612f57565b610ecb565b6101e2610316366004612fb1565b6111d7565b6101e2610329366004613009565b611201565b6101e261033c3660046130b7565b61154f565b61038961034f366004612fb1565b6004602081905260009182526040909120805460018201546002830154600384015493909401546001600160a01b03909216939092909185565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00161016d565b6101c1611700565b60025461026c906001600160a01b031681565b6101e26103e4366004612fb1565b611772565b60035461026c906001600160a01b031681565b600154604051632fe4a15f60e21b8152306004820152600091829182918291829182916001600160a01b039091169063bf92857c9060240160c060405180830381865afa158015610451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104759190613121565b949b939a50919850965094509092509050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828888886040518463ffffffff1660e01b81526004016104de9392919061316b565b602060405180830381865afa1580156104fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051f9190613193565b90506001600160a01b0381166105505760405162461bcd60e51b8152600401610547906131b0565b60405180910390fd5b600080876001600160a01b0316896001600160a01b031610610573578789610576565b88885b91509150600080846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa1580156105bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105df91906131fe565b50505050509150915060006064826105f791906132a7565b905060006106068360646132d2565b6040516bffffffffffffffffffffffff193060601b16602082015260e884811b603483015282901b60378201529091506001600160a01b0388169063514ea4bf90603a01604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161067e91815260200190565b60a060405180830381865afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf919061330e565b50929c50909a509850505050505050505093509350939050565b6003546000906001600160a01b031633146107065760405162461bcd60e51b815260040161054790613365565b6001600160a01b0385166000908152600460205260409020600101548311156107415760405162461bcd60e51b815260040161054790613389565b61074f8585856001866117b0565b6001600160a01b03861660009081526004602052604081206001018054929350859290919061077f9084906133b7565b90915550506001600160a01b038416600090815260046020526040812060010180548392906107af9084906133ca565b909155509095945050505050565b6003546001600160a01b031633146107e75760405162461bcd60e51b815260040161054790613365565b6040805180820190915260048152636161766560e01b60209182015283519084012083907fe0a39fef8aa5887c76606e7a14a5db8dc6676191e4866b2a609a3aa003b183291480159061087f575060408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528151908201207f2b05eae252b2d830081b9362c105fc1b4e5f974a0c53bee02c06419c2f4a117e14155b1561089f57806040516303622bc560e21b81526004016105479190613423565b6001600160a01b0383166000908152600460205260409020600101548211156108da5760405162461bcd60e51b815260040161054790613389565b6040805180820190915260048152636161766560e01b6020918201528451908501207f1f5c6010755a7783899f9185eb5a247239989e6e1b7994d59f65c55ffc4e7cd7016109625761092c83836119e2565b6001600160a01b038316600090815260046020526040812060020180548492906109579084906133ca565b909155506109e99050565b60408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528451908501207fd4fa151dad4d27cff7e46c9d3efa03e4b1a068b5f3ac411fd3f9be63d0b5ee82016109e9576109b88383611b6b565b6001600160a01b038316600090815260046020526040812060030180548492906109e39084906133ca565b90915550505b6001600160a01b03831660009081526004602052604081206001018054849290610a149084906133b7565b909155505050505050565b610a5a6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b506001600160a01b03908116600090815260046020818152604092839020835160a08101855281549095168552600181015491850191909152600281015492840192909252600382015460608401520154608082015290565b610abb611cdf565b610ac56000611d0c565b565b610acf611cdf565b604051636eb1769f60e11b815233600482015230602482015281906001600160a01b0384169063dd62ed3e90604401602060405180830381865afa158015610b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3f9190613436565b1015610b865760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610547565b6040516323b872dd60e01b8152336004820152306024820152604481018290526000906001600160a01b038416906323b872dd906064016020604051808303816000875af1158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c00919061344f565b905080610c415760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610547565b6001600160a01b03831660009081526004602052604081206001018054849290610c6c9084906133ca565b90915550506040518281526001600160a01b038416907fab79632de7fe1724598ce2214eaa326d90d48064d2d3397406ecc5769316a5f6906020015b60405180910390a2505050565b610cbd611cdf565b6001600160a01b038216600090815260046020526040902060010154811115610cf85760405162461bcd60e51b815260040161054790613389565b816001600160a01b031663095ea7b3610d196000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a919061344f565b506000826001600160a01b031663a9059cbb610dae6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f919061344f565b905080610e605760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610547565b6001600160a01b03831660009081526004602052604081206001018054849290610e8b9084906133b7565b90915550506040518281526001600160a01b038416907f7e2c99819371db0a6fc6f4269fe872496e44f502df19ba3eae594b7a1598746090602001610ca8565b6003546000906001600160a01b03163314610ef85760405162461bcd60e51b815260040161054790613365565b6040805180820190915260048152636161766560e01b60209182015284519085012084907fe0a39fef8aa5887c76606e7a14a5db8dc6676191e4866b2a609a3aa003b1832914801590610f90575060408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528151908201207f2b05eae252b2d830081b9362c105fc1b4e5f974a0c53bee02c06419c2f4a117e14155b15610fb057806040516303622bc560e21b81526004016105479190613423565b6040805180820190915260048152636161766560e01b6020918201528551908601207f1f5c6010755a7783899f9185eb5a247239989e6e1b7994d59f65c55ffc4e7cd7016110a8576001600160a01b0384166000908152600460205260409020600201548311156110635760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420696e76657374656420616d6f756e74000000006044820152606401610547565b61106d8484611d5c565b6001600160a01b03851660009081526004602052604081206002018054929450859290919061109d9084906133b7565b9091555061119f9050565b60408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528551908601207fd4fa151dad4d27cff7e46c9d3efa03e4b1a068b5f3ac411fd3f9be63d0b5ee820161119f576001600160a01b03841660009081526004602052604090206003015483111561115f5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420696e76657374656420616d6f756e74000000006044820152606401610547565b6111698484611e4d565b6001600160a01b0385166000908152600460205260408120600301805492945085929091906111999084906133b7565b90915550505b6001600160a01b038416600090815260046020526040812060010180548492906111ca9084906133ca565b9091555050509392505050565b6111df611cdf565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b0316331461122b5760405162461bcd60e51b815260040161054790613365565b6040805180820190915260078152660756e69737761760cc1b60209182015288519089012088907fa2a03459171c76bff45817330c10ef9f8af07011a33005b73b50189bbc7e7132148015906112c757506040805180820190915260098152686165726f64726f6d6560b81b6020918201528151908201207fc570e6c17f57bc6841b1057f94fcf1785f440006714dbd98f64d859b54cd25d314155b156112e757806040516303622bc560e21b81526004016105479190613423565b6001600160a01b0388166000908152600460205260409020600101548611156113525760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742062616c616e636520746f6b656e3000000000006044820152606401610547565b6001600160a01b0387166000908152600460205260409020600101548511156113bd5760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742062616c616e636520746f6b656e3100000000006044820152606401610547565b6040805180820190915260078152660756e69737761760cc1b6020918201528951908a01207f5d5fcba6e8e389400ba7e8ccf3ef1060750f8fee5ccffa48c4afe76443818ece0161147e5761141788888888888888612008565b506001600160a01b038816600090815260046020819052604082200180548892906114439084906133ca565b90915550506001600160a01b038716600090815260046020819052604082200180548792906114739084906133ca565b909155506114e49050565b6040805180820190915260098152686165726f64726f6d6560b81b6020918201528951908a01207f3a8f193e80a84397be4efa806b030e87a0bbfff98eb2426709b27a64ab32da2d016114e4576040516305fcd0f760e01b815260040160405180910390fd5b6001600160a01b0388166000908152600460205260408120600101805488929061150f9084906133b7565b90915550506001600160a01b0387166000908152600460205260408120600101805487929061153f9084906133b7565b9091555050505050505050505050565b6003546001600160a01b031633146115795760405162461bcd60e51b815260040161054790613365565b6040805180820190915260078152660756e69737761760cc1b60209182015284519085012084907fa2a03459171c76bff45817330c10ef9f8af07011a33005b73b50189bbc7e71321480159061161557506040805180820190915260098152686165726f64726f6d6560b81b6020918201528151908201207fc570e6c17f57bc6841b1057f94fcf1785f440006714dbd98f64d859b54cd25d314155b1561163557806040516303622bc560e21b81526004016105479190613423565b6040805180820190915260078152660756e69737761760cc1b6020918201528551908601207f5d5fcba6e8e389400ba7e8ccf3ef1060750f8fee5ccffa48c4afe76443818ece016116935761168e8484610bb8856123c0565b6116f9565b6040805180820190915260098152686165726f64726f6d6560b81b6020918201528551908601207f3a8f193e80a84397be4efa806b030e87a0bbfff98eb2426709b27a64ab32da2d016116f9576040516305fcd0f760e01b815260040160405180910390fd5b5050505050565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176d9190613436565b905090565b61177a611cdf565b6001600160a01b0381166117a457604051631e4fbdf760e01b815260006004820152602401610547565b6117ad81611d0c565b50565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590526000919087169063095ea7b3906044016020604051808303816000875af1158015611823573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611847919061344f565b5060408051610100810182526001600160a01b0388811682528781166020830190815262ffffff8681168486019081523060608601908152426080870190815260a087018c815260c088018c8152600060e08a01908152995163414bf38960e01b815289518916600482015296518816602488015293519094166044860152905185166064850152516084840152905160a48301525160c48201529251811660e484015290917f00000000000000000000000000000000000000000000000000000000000000009091169063414bf38990610104016020604051808303816000875af115801561193b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195f9190613436565b604080516001600160a01b038a811682528981166020830152918101889052606081018390529193507f000000000000000000000000000000000000000000000000000000000000000016907fad56699d0f375866eb895ed27203058a36a713382aaded78eb6b67da266d43329060800160405180910390a25095945050505050565b60015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905260009184169063095ea7b3906044016020604051808303816000875af1158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b919061344f565b905080611aba5760405162461bcd60e51b815260206004820152602760248201527f417070726f76616c206f6620617373657420696e746f204161766520706f6f6c6044820152660819985a5b195960ca1b6064820152608401610547565b60015460405163617ba03760e01b81526001600160a01b03858116600483015260248201859052306044830152600060648301529091169063617ba03790608401600060405180830381600087803b158015611b1557600080fd5b505af1158015611b29573d6000803e3d6000fd5b505050507f76bfb501e0568602c59c0cffcde817c5bc2696480830199d9f8c115afe02c54e8383604051611b5e92919061346a565b60405180910390a1505050565b60025460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905260009184169063095ea7b3906044016020604051808303816000875af1158015611bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be4919061344f565b905080611c425760405162461bcd60e51b815260206004820152602660248201527f417070726f76616c206f6620617373657420696e746f20436f6d706f756e642060448201526519985a5b195960d21b6064820152608401610547565b600254604051634232cd6360e01b81523060048201526001600160a01b0385811660248301526044820185905290911690634232cd6390606401600060405180830381600087803b158015611c9657600080fd5b505af1158015611caa573d6000803e3d6000fd5b505050507f76bfb501e0568602c59c0cffcde817c5bc2696480830199d9f8c115afe02c54e8383604051611b5e92919061349e565b6000546001600160a01b03163314610ac55760405163118cdaa760e01b8152336004820152602401610547565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080611d676103fc565b5050505050905082811015611d8e5760405162461bcd60e51b8152600401610547906134d6565b600154604051631a4ca37b60e21b81526001600160a01b03868116600483015260248201869052306044830152909116906369328dec906064016020604051808303816000875af1158015611de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0b9190613436565b91507ff2119ac293790f480d31afd7d613930c9e10d9432d0dedb82738f50368fa27b58484604051611e3e92919061346a565b60405180910390a15092915050565b600080611e58611700565b905082811015611e7a5760405162461bcd60e51b8152600401610547906134d6565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa158015611ec1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee59190613436565b60025460405163f3fef3a360e01b81526001600160a01b0388811660048301526024820188905292935091169063f3fef3a390604401600060405180830381600087803b158015611f3557600080fd5b505af1158015611f49573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03881691506370a0823190602401602060405180830381865afa158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb89190613436565b9050611fc482826133b7565b93507ff2119ac293790f480d31afd7d613930c9e10d9432d0dedb82738f50368fa27b58685604051611ff792919061349e565b60405180910390a150505092915050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828a8a886040518463ffffffff1660e01b815260040161205b9392919061316b565b602060405180830381865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190613193565b90506001600160a01b0381166120c45760405162461bcd60e51b8152600401610547906131b0565b600080896001600160a01b03168b6001600160a01b0316106120e757898b6120ea565b8a8a5b915091506000826001600160a01b03168c6001600160a01b03161461210f5788612111565b895b90506000836001600160a01b03168d6001600160a01b031614612134578a612136565b895b60405163095ea7b360e01b81526001600160a01b038781166004830152602482018590529192509085169063095ea7b3906044016020604051808303816000875af1158015612189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ad919061344f565b5060405163095ea7b360e01b81526001600160a01b0386811660048301526024820183905284169063095ea7b3906044016020604051808303816000875af11580156121fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612221919061344f565b506000856001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa158015612262573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228691906131fe565b505050505050905060006122998a6126af565b905060006122a68a6126af565b90506122b58383838888612af1565b9850600080896001600160a01b0316633c8a7d8d308f8f8f306040516020016122ed91906001600160a01b0391909116815260200190565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161231c959493929190613518565b60408051808303816000875af115801561233a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235e9190613565565b91509150896001600160a01b03167fce0669c03a6bebf1a7a80046c110092cafdff0bb527ff2e4ea213faf8f07cf118a8a8e86866040516123a3959493929190613589565b60405180910390a250505050505050505050979650505050505050565b604051630b4c774160e11b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631698ee82906124139088908890889060040161316b565b602060405180830381865afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124549190613193565b90506001600160a01b03811661247c5760405162461bcd60e51b8152600401610547906131b0565b600080856001600160a01b0316876001600160a01b03161061249f5785876124a2565b86865b91509150600080846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa1580156124e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250b91906131fe565b505050505091509150600060648261252391906132a7565b905060006125328360646132d2565b60405163a34123a760e01b8152600284810b600483015282900b60248201526001600160801b038a16604482015290915060009081906001600160a01b038a169063a34123a79060640160408051808303816000875af115801561259a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125be9190613565565b6040516309e3d67b60e31b8152306004820152600287810b602483015286900b60448201526001600160801b0380841660648301528216608482015291935091506001600160a01b038a1690634f1eb3d89060a40160408051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265591906135c3565b5050886001600160a01b03167ff0c5c8e0b584b9430fbe397d62831fc7eca3e734a39a08659847de97469501de89898d8686604051612698959493929190613589565b60405180910390a250505050505050505050505050565b6000620d89e719600283900b128015906126db57506126d1620d89e7196135f6565b60020b8260020b13155b6127165760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207469636b60a01b6044820152606401610547565b6000808360020b1261272b578260020b612738565b8260020b61273890613618565b905060008160011660000361275157600160801b612763565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156127a257608061279d826ffff97272373d413259a46990580e213a613634565b901c90505b60048216156127cc5760806127c7826ffff2e50f5f656932ef12357cf3c7fdcc613634565b901c90505b60088216156127f65760806127f1826fffe5caca7e10e4e61c3624eaa0941cd0613634565b901c90505b601082161561282057608061281b826fffcb9843d60f6159c9db58835c926644613634565b901c90505b602082161561284a576080612845826fff973b41fa98c081472e6896dfb254c0613634565b901c90505b604082161561287457608061286f826fff2ea16466c96a3843ec78b326b52861613634565b901c90505b608082161561289e576080612899826ffe5dee046a99a2a811c461f1969c3053613634565b901c90505b6101008216156128c95760806128c4826ffcbe86c7900a88aedcffc83b479aa3a4613634565b901c90505b6102008216156128f45760806128ef826ff987a7253ac413176f2b074cf7815e54613634565b901c90505b61040082161561291f57608061291a826ff3392b0822b70005940c7a398e4b70f3613634565b901c90505b61080082161561294a576080612945826fe7159475a2c29b7443b29c7fa6e889d9613634565b901c90505b611000821615612975576080612970826fd097f3bdfd2022b8845ad8f792aa5825613634565b901c90505b6120008216156129a057608061299b826fa9f746462d870fdf8a65dc1f90e061e5613634565b901c90505b6140008216156129cb5760806129c6826f70d869a156d2a1b890bb3df62baf32f7613634565b901c90505b6180008216156129f65760806129f1826f31be135f97d08fd981231505542fcfa6613634565b901c90505b62010000821615612a22576080612a1d826f09aa508b5b7a84e1c677de54f3e99bc9613634565b901c90505b62020000821615612a4d576080612a48826e5d6af8dedb81196699c329225ee604613634565b901c90505b62040000821615612a77576080612a72826d2216e584f5fa1ea926041bedfe98613634565b901c90505b62080000821615612a9f576080612a9a826b048a170391f7dc42444e8fa2613634565b901c90505b60008460020b1315612aba57612ab781600019613661565b90505b612ac964010000000082613675565b15612ad5576001612ad8565b60005b612ae99060ff16602083901c6133ca565b949350505050565b6000836001600160a01b0316856001600160a01b03161115612b11579293925b846001600160a01b0316866001600160a01b031611612b3c57612b35858585612bb5565b9050612bac565b836001600160a01b0316866001600160a01b03161015612b9e576000612b63878686612bb5565b90506000612b72878986612c2a565b9050806001600160801b0316826001600160801b031610612b935780612b95565b815b92505050612bac565b612ba9858584612c2a565b90505b95945050505050565b6000826001600160a01b0316846001600160a01b03161115612bd5579192915b6000612bf8856001600160a01b0316856001600160a01b0316600160601b612c60565b9050612c1f612c1a8483612c0c8989613689565b6001600160a01b0316612c60565b612dd9565b9150505b9392505050565b6000826001600160a01b0316846001600160a01b03161115612c4a579192915b612ae9612c1a83600160601b612c0c8888613689565b6000808060001985870985870292508281108382030391505080600003612c995760008411612c8e57600080fd5b508290049050612c23565b808411612ca557600080fd5b6000848688098084039381119092039190506000612cc5861960016133ca565b8616958690049593849004936000819003046001019050612ce68184613634565b909317926000612cf7876003613634565b6002189050612d068188613634565b612d119060026133b7565b612d1b9082613634565b9050612d278188613634565b612d329060026133b7565b612d3c9082613634565b9050612d488188613634565b612d539060026133b7565b612d5d9082613634565b9050612d698188613634565b612d749060026133b7565b612d7e9082613634565b9050612d8a8188613634565b612d959060026133b7565b612d9f9082613634565b9050612dab8188613634565b612db69060026133b7565b612dc09082613634565b9050612dcc8186613634565b9998505050505050505050565b806001600160801b0381168114612def57600080fd5b919050565b6001600160a01b03811681146117ad57600080fd5b803562ffffff81168114612def57600080fd5b600080600060608486031215612e3157600080fd5b8335612e3c81612df4565b92506020840135612e4c81612df4565b9150612e5a60408501612e09565b90509250925092565b60008060008060808587031215612e7957600080fd5b8435612e8481612df4565b93506020850135612e9481612df4565b925060408501359150612ea960608601612e09565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612edb57600080fd5b813567ffffffffffffffff80821115612ef657612ef6612eb4565b604051601f8301601f19908116603f01168101908282118183101715612f1e57612f1e612eb4565b81604052838152866020858801011115612f3757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612f6c57600080fd5b833567ffffffffffffffff811115612f8357600080fd5b612f8f86828701612eca565b9350506020840135612fa081612df4565b929592945050506040919091013590565b600060208284031215612fc357600080fd5b8135612c2381612df4565b60008060408385031215612fe157600080fd5b8235612fec81612df4565b946020939093013593505050565b8060020b81146117ad57600080fd5b600080600080600080600080610100898b03121561302657600080fd5b883567ffffffffffffffff81111561303d57600080fd5b6130498b828c01612eca565b985050602089013561305a81612df4565b9650604089013561306a81612df4565b9550606089013594506080890135935061308660a08a01612e09565b925060c089013561309681612ffa565b915060e08901356130a681612ffa565b809150509295985092959890939650565b600080600080608085870312156130cd57600080fd5b843567ffffffffffffffff8111156130e457600080fd5b6130f087828801612eca565b945050602085013561310181612df4565b9250604085013561311181612df4565b9396929550929360600135925050565b60008060008060008060c0878903121561313a57600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6000602082840312156131a557600080fd5b8151612c2381612df4565b602080825260129082015271141bdbdb08191bd95cdb89dd08195e1a5cdd60721b604082015260600190565b805161ffff81168114612def57600080fd5b80518015158114612def57600080fd5b600080600080600080600060e0888a03121561321957600080fd5b875161322481612df4565b602089015190975061323581612ffa565b9550613243604089016131dc565b9450613251606089016131dc565b935061325f608089016131dc565b925060a088015160ff8116811461327557600080fd5b915061328360c089016131ee565b905092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b600282810b9082900b03627fffff198112627fffff821317156132cc576132cc613291565b92915050565b600281810b9083900b01627fffff8113627fffff19821217156132cc576132cc613291565b80516001600160801b0381168114612def57600080fd5b600080600080600060a0868803121561332657600080fd5b61332f866132f7565b9450602086015193506040860151925061334b606087016132f7565b9150613359608087016132f7565b90509295509295909350565b6020808252600a908201526913db9b1e481859d95b9d60b21b604082015260600190565b602080825260149082015273496e73756666696369656e742062616c616e636560601b604082015260600190565b818103818111156132cc576132cc613291565b808201808211156132cc576132cc613291565b6000815180845260005b81811015613403576020818501810151868301820152016133e7565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612c2360208301846133dd565b60006020828403121561344857600080fd5b5051919050565b60006020828403121561346157600080fd5b612c23826131ee565b6060808252600490820152634161766560e01b60808201526001600160a01b03929092166020830152604082015260a00190565b60608082526008908201526710dbdb5c1bdd5b9960c21b60808201526001600160a01b03929092166020830152604082015260a00190565b60208082526022908201527f43616e6e6f74207769746864726177206d6f7265207468616e20626f72726f77604082015261195960f21b606082015260800190565b60018060a01b03861681528460020b60208201528360020b60408201526001600160801b038316606082015260a06080820152600061355a60a08301846133dd565b979650505050505050565b6000806040838503121561357857600080fd5b505080516020909101519092909150565b6001600160a01b0395861681529390941660208401526001600160801b039190911660408301526060820152608081019190915260a00190565b600080604083850312156135d657600080fd5b6135df836132f7565b91506135ed602084016132f7565b90509250929050565b60008160020b627fffff19810361360f5761360f613291565b60000392915050565b6000600160ff1b820161362d5761362d613291565b5060000390565b80820281158282048414176132cc576132cc613291565b634e487b7160e01b600052601260045260246000fd5b6000826136705761367061364b565b500490565b6000826136845761368461364b565b500690565b6001600160a01b038281168282160390808211156136a9576136a9613291565b509291505056fea2646970667358221220a3e658e993430ca9253841754cb27b4fca331c7c702af9bee59b01b0c2eccc4564736f6c63430008160033a2646970667358221220de6f151a0a324d3d7baddd11cfe6c03608330881e9115e4188f3d0d0db83074064736f6c63430008160033", + "nonce": "0x1", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x8078fc", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4bcd3ea0a755da46d20fa618e7b7aa1bfb335bcb161203df48bb164193235b0d", + "transactionIndex": "0x21", + "blockHash": "0x64dc3ab57f4570a4126797625cf89d3af7a2333fe74b9180a8886dd72be1c543", + "blockNumber": "0x149d03a", + "gasUsed": "0x3aa811", + "effectiveGasPrice": "0xe15d4", + "from": "0x7e393441edc1bb1621318e000cdfc74947f23b26", + "to": null, + "contractAddress": "0xba31d235cf7f92f857fe891b630110efe1e47002", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xf91ad7fe4b", + "l1GasPrice": "0x1b7591874", + "l1GasUsed": "0x202f9" + } + ], + "libraries": [], + "pending": [], + "returns": { + "0": { + "internal_type": "contract VaultFactory", + "value": "0xbA31d235cF7F92f857FE891B630110EFe1e47002" + } + }, + "timestamp": 1738997609, + "chain": 84532, + "commit": "8832140" +} \ No newline at end of file diff --git a/broadcast/DeployVaultFactory.s.sol/84532/run-latest.json b/broadcast/DeployVaultFactory.s.sol/84532/run-latest.json new file mode 100644 index 0000000..66c62dd --- /dev/null +++ b/broadcast/DeployVaultFactory.s.sol/84532/run-latest.json @@ -0,0 +1,57 @@ +{ + "transactions": [ + { + "hash": "0x4bcd3ea0a755da46d20fa618e7b7aa1bfb335bcb161203df48bb164193235b0d", + "transactionType": "CREATE", + "contractName": "VaultFactory", + "contractAddress": "0xba31d235cf7f92f857fe891b630110efe1e47002", + "function": null, + "arguments": null, + "transaction": { + "from": "0x7e393441edc1bb1621318e000cdfc74947f23b26", + "gas": "0x4c3b79", + "value": "0x0", + "input": "0x6080604052600c805462ff00ff19166201000117905534801561002157600080fd5b506101546040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810191909152506040805161012081018252734200000000000000000000000000000000000006815273036cbd53842c5426634e7929541ec2318f3dcf7e602082015273fe45bf4def7223ab1bf83ca17a4462ef1647f7ff9181019190915273571621ce60cebb0c1d442b5afb38b1663c6bf0176060820152734752ba5dbc23f44d87826276bf6fd6b1c372ad2460808201527394cc0aac535ccdb3c01d6787d6413c739ae12bc460a082015273c5290058841028f1614f3a6f0f5816cad0df5e2760c082015273be781d7bdf469f3d94a62cdcc407ace106aeca7460e0820152604d61010082015290565b8051600e80546001600160a01b03199081166001600160a01b03938416179091556020830151600f8054831691841691909117905560408301516010805483169184169190911790556060830151601180548316918416919091179055608083015160128054831691841691909117905560a083015160138054831691841691909117905560c083015160148054831691841691909117905560e083015160158054831691841691909117905561010090920151601680549093169116179055614074806102236000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063989e6fd911610066578063989e6fd914610191578063b4bd6f4614610199578063d1a43bda146101ac578063d7b65745146101b4578063f8ccbf471461025257600080fd5b806347ae49e714610098578063522c441d1461012a57806358f674761461013257806365cacaa414610173575b600080fd5b6100a0610275565b604051610121919081516001600160a01b03908116825260208084015182169083015260408084015182169083015260608084015182169083015260808084015182169083015260a08084015182169083015260c08084015182169083015260e0808401518216908301526101009283015116918101919091526101200190565b60405180910390f35b6100a0610306565b61015b6101403660046106cf565b600d602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610121565b336000908152600d60205260409020546001600160a01b031661015b565b6100a06103a8565b61015b6101a73660046106cf565b61043b565b6100a061052a565b600e54600f546010546011546012546013546014546015546016546101f8986001600160a01b03908116988116978116968116958116948116938116928116911689565b604080516001600160a01b039a8b168152988a1660208a01529689169688019690965293871660608701529186166080860152851660a0850152841660c0840152831660e083015290911661010082015261012001610121565b600c546102659062010000900460ff1681565b6040519015158152602001610121565b61027d610676565b5060408051610120810182526000808252735425890298aed601595a70ab815c96711a31bc656020830152739cfcc1b289e59fbe1e769f020c77315df847376092820192909252606081018290526080810182905260a0810182905260c0810191909152738b9b2af4afb389b4a70a474dfd4adcd4a302bb4060e0820152604d61010082015290565b61030e610676565b50604080516101208101825273c558dbdd856501fcd9aaf1e62eae57a9f0629a3c81527394a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c86020820152600091810182905273e3e0106227181958abfba960c13d0fe52c73326560608201526080810182905260a0810182905260c0810191909152736ae43d3271ff6888e7fc43fd7321a503ff73895160e0820152604d61010082015290565b6103b0610676565b6103ee6040518060400160405280601881526020017f54657374696e67204f6e20416e76696c204e6574776f726b000000000000000081525061060b565b506040805161012081018252600080825260016020830152918101829052606081019190915260026080820152600360a0820152600660c0820152600760e0820152604d61010082015290565b601654601554601154601354601254604051600095869588956001600160a01b03928316959183169490831693918316921690610477906106c2565b6001600160a01b0396871681529486166020860152928516604085015290841660608401528316608083015290911660a082015260c001604051809103906000f0801580156104ca573d6000803e3d6000fd5b506001600160a01b038481166000818152600d602052604080822080546001600160a01b031916948616948517905551939450919290917f5d9c31ffa0fecffd7cf379989a3c7af252f0335e0d2a1320b55245912c781f5391a392915050565b610532610676565b5060408051610120810182526006602160991b01815273036cbd53842c5426634e7929541ec2318f3dcf7e602082015273fe45bf4def7223ab1bf83ca17a4462ef1647f7ff9181019190915273571621ce60cebb0c1d442b5afb38b1663c6bf0176060820152734752ba5dbc23f44d87826276bf6fd6b1c372ad2460808201527394cc0aac535ccdb3c01d6787d6413c739ae12bc460a082015273c5290058841028f1614f3a6f0f5816cad0df5e2760c082015273be781d7bdf469f3d94a62cdcc407ace106aeca7460e0820152604d61010082015290565b61064e8160405160240161061f91906106ff565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052610651565b50565b61064e8160006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6138f08061074f83390190565b6000602082840312156106e157600080fd5b81356001600160a01b03811681146106f857600080fd5b9392505050565b60006020808352835180602085015260005b8181101561072d57858101830151858201604001528201610711565b506000604082860101526040601f19601f830116850101925050509291505056fe60c06040523480156200001157600080fd5b50604051620038f0380380620038f0833981016040819052620000349162000139565b83838383896001600160a01b0381166200006857604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200007381620000cc565b50600180546001600160a01b039586166001600160a01b0319918216179091556002805494861694821694909417909355908316608052821660a052600380549790921696169590951790945550620001ba9350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200013457600080fd5b919050565b60008060008060008060c087890312156200015357600080fd5b6200015e876200011c565b95506200016e602088016200011c565b94506200017e604088016200011c565b93506200018e606088016200011c565b92506200019e608088016200011c565b9150620001ae60a088016200011c565b90509295509295509295565b60805160a0516136e66200020a60003960008181610289015281816104900152818161200d01526123da01526000818161024a015281816117c7015281816118ef015261198a01526136e66000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063a03e4bc3116100b8578063ca11615e1161007c578063ca11615e1461032e578063dc06618014610341578063e6e1bdec146103bb578063e8f6daa9146103c3578063f2fde38b146103d6578063f5ff5c76146103e957600080fd5b8063a03e4bc3146102cf578063a1db9782146102e2578063aab76479146102f5578063bcf685ed14610308578063c7d716d71461031b57600080fd5b8063715018a6116100ff578063715018a61461023d578063735de9f7146102455780638bdb2afa146102845780638da5cb5b146102ab57806397feb926146102bc57600080fd5b806321db82401461013c5780634a0de08f14610176578063592bac55146101ae5780635d631152146101cf5780635db8083e146101e4575b600080fd5b6101446103fc565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0015b60405180910390f35b610189610184366004612e1c565b610488565b604080516001600160801b03909416845260208401929092529082015260600161016d565b6101c16101bc366004612e63565b6106d9565b60405190815260200161016d565b6101e26101dd366004612f57565b6107bd565b005b6101f76101f2366004612fb1565b610a1f565b60405161016d919081516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080918201519181019190915260a00190565b6101e2610ab3565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161016d565b61026c7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031661026c565b6101e26102ca366004612fce565b610ac7565b60015461026c906001600160a01b031681565b6101e26102f0366004612fce565b610cb5565b6101c1610303366004612f57565b610ecb565b6101e2610316366004612fb1565b6111d7565b6101e2610329366004613009565b611201565b6101e261033c3660046130b7565b61154f565b61038961034f366004612fb1565b6004602081905260009182526040909120805460018201546002830154600384015493909401546001600160a01b03909216939092909185565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00161016d565b6101c1611700565b60025461026c906001600160a01b031681565b6101e26103e4366004612fb1565b611772565b60035461026c906001600160a01b031681565b600154604051632fe4a15f60e21b8152306004820152600091829182918291829182916001600160a01b039091169063bf92857c9060240160c060405180830381865afa158015610451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104759190613121565b949b939a50919850965094509092509050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828888886040518463ffffffff1660e01b81526004016104de9392919061316b565b602060405180830381865afa1580156104fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051f9190613193565b90506001600160a01b0381166105505760405162461bcd60e51b8152600401610547906131b0565b60405180910390fd5b600080876001600160a01b0316896001600160a01b031610610573578789610576565b88885b91509150600080846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa1580156105bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105df91906131fe565b50505050509150915060006064826105f791906132a7565b905060006106068360646132d2565b6040516bffffffffffffffffffffffff193060601b16602082015260e884811b603483015282901b60378201529091506001600160a01b0388169063514ea4bf90603a01604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161067e91815260200190565b60a060405180830381865afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf919061330e565b50929c50909a509850505050505050505093509350939050565b6003546000906001600160a01b031633146107065760405162461bcd60e51b815260040161054790613365565b6001600160a01b0385166000908152600460205260409020600101548311156107415760405162461bcd60e51b815260040161054790613389565b61074f8585856001866117b0565b6001600160a01b03861660009081526004602052604081206001018054929350859290919061077f9084906133b7565b90915550506001600160a01b038416600090815260046020526040812060010180548392906107af9084906133ca565b909155509095945050505050565b6003546001600160a01b031633146107e75760405162461bcd60e51b815260040161054790613365565b6040805180820190915260048152636161766560e01b60209182015283519084012083907fe0a39fef8aa5887c76606e7a14a5db8dc6676191e4866b2a609a3aa003b183291480159061087f575060408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528151908201207f2b05eae252b2d830081b9362c105fc1b4e5f974a0c53bee02c06419c2f4a117e14155b1561089f57806040516303622bc560e21b81526004016105479190613423565b6001600160a01b0383166000908152600460205260409020600101548211156108da5760405162461bcd60e51b815260040161054790613389565b6040805180820190915260048152636161766560e01b6020918201528451908501207f1f5c6010755a7783899f9185eb5a247239989e6e1b7994d59f65c55ffc4e7cd7016109625761092c83836119e2565b6001600160a01b038316600090815260046020526040812060020180548492906109579084906133ca565b909155506109e99050565b60408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528451908501207fd4fa151dad4d27cff7e46c9d3efa03e4b1a068b5f3ac411fd3f9be63d0b5ee82016109e9576109b88383611b6b565b6001600160a01b038316600090815260046020526040812060030180548492906109e39084906133ca565b90915550505b6001600160a01b03831660009081526004602052604081206001018054849290610a149084906133b7565b909155505050505050565b610a5a6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b506001600160a01b03908116600090815260046020818152604092839020835160a08101855281549095168552600181015491850191909152600281015492840192909252600382015460608401520154608082015290565b610abb611cdf565b610ac56000611d0c565b565b610acf611cdf565b604051636eb1769f60e11b815233600482015230602482015281906001600160a01b0384169063dd62ed3e90604401602060405180830381865afa158015610b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3f9190613436565b1015610b865760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610547565b6040516323b872dd60e01b8152336004820152306024820152604481018290526000906001600160a01b038416906323b872dd906064016020604051808303816000875af1158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c00919061344f565b905080610c415760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610547565b6001600160a01b03831660009081526004602052604081206001018054849290610c6c9084906133ca565b90915550506040518281526001600160a01b038416907fab79632de7fe1724598ce2214eaa326d90d48064d2d3397406ecc5769316a5f6906020015b60405180910390a2505050565b610cbd611cdf565b6001600160a01b038216600090815260046020526040902060010154811115610cf85760405162461bcd60e51b815260040161054790613389565b816001600160a01b031663095ea7b3610d196000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a919061344f565b506000826001600160a01b031663a9059cbb610dae6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af1158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f919061344f565b905080610e605760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610547565b6001600160a01b03831660009081526004602052604081206001018054849290610e8b9084906133b7565b90915550506040518281526001600160a01b038416907f7e2c99819371db0a6fc6f4269fe872496e44f502df19ba3eae594b7a1598746090602001610ca8565b6003546000906001600160a01b03163314610ef85760405162461bcd60e51b815260040161054790613365565b6040805180820190915260048152636161766560e01b60209182015284519085012084907fe0a39fef8aa5887c76606e7a14a5db8dc6676191e4866b2a609a3aa003b1832914801590610f90575060408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528151908201207f2b05eae252b2d830081b9362c105fc1b4e5f974a0c53bee02c06419c2f4a117e14155b15610fb057806040516303622bc560e21b81526004016105479190613423565b6040805180820190915260048152636161766560e01b6020918201528551908601207f1f5c6010755a7783899f9185eb5a247239989e6e1b7994d59f65c55ffc4e7cd7016110a8576001600160a01b0384166000908152600460205260409020600201548311156110635760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420696e76657374656420616d6f756e74000000006044820152606401610547565b61106d8484611d5c565b6001600160a01b03851660009081526004602052604081206002018054929450859290919061109d9084906133b7565b9091555061119f9050565b60408051808201909152600881526718dbdb5c1bdd5b9960c21b6020918201528551908601207fd4fa151dad4d27cff7e46c9d3efa03e4b1a068b5f3ac411fd3f9be63d0b5ee820161119f576001600160a01b03841660009081526004602052604090206003015483111561115f5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420696e76657374656420616d6f756e74000000006044820152606401610547565b6111698484611e4d565b6001600160a01b0385166000908152600460205260408120600301805492945085929091906111999084906133b7565b90915550505b6001600160a01b038416600090815260046020526040812060010180548492906111ca9084906133ca565b9091555050509392505050565b6111df611cdf565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b0316331461122b5760405162461bcd60e51b815260040161054790613365565b6040805180820190915260078152660756e69737761760cc1b60209182015288519089012088907fa2a03459171c76bff45817330c10ef9f8af07011a33005b73b50189bbc7e7132148015906112c757506040805180820190915260098152686165726f64726f6d6560b81b6020918201528151908201207fc570e6c17f57bc6841b1057f94fcf1785f440006714dbd98f64d859b54cd25d314155b156112e757806040516303622bc560e21b81526004016105479190613423565b6001600160a01b0388166000908152600460205260409020600101548611156113525760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742062616c616e636520746f6b656e3000000000006044820152606401610547565b6001600160a01b0387166000908152600460205260409020600101548511156113bd5760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742062616c616e636520746f6b656e3100000000006044820152606401610547565b6040805180820190915260078152660756e69737761760cc1b6020918201528951908a01207f5d5fcba6e8e389400ba7e8ccf3ef1060750f8fee5ccffa48c4afe76443818ece0161147e5761141788888888888888612008565b506001600160a01b038816600090815260046020819052604082200180548892906114439084906133ca565b90915550506001600160a01b038716600090815260046020819052604082200180548792906114739084906133ca565b909155506114e49050565b6040805180820190915260098152686165726f64726f6d6560b81b6020918201528951908a01207f3a8f193e80a84397be4efa806b030e87a0bbfff98eb2426709b27a64ab32da2d016114e4576040516305fcd0f760e01b815260040160405180910390fd5b6001600160a01b0388166000908152600460205260408120600101805488929061150f9084906133b7565b90915550506001600160a01b0387166000908152600460205260408120600101805487929061153f9084906133b7565b9091555050505050505050505050565b6003546001600160a01b031633146115795760405162461bcd60e51b815260040161054790613365565b6040805180820190915260078152660756e69737761760cc1b60209182015284519085012084907fa2a03459171c76bff45817330c10ef9f8af07011a33005b73b50189bbc7e71321480159061161557506040805180820190915260098152686165726f64726f6d6560b81b6020918201528151908201207fc570e6c17f57bc6841b1057f94fcf1785f440006714dbd98f64d859b54cd25d314155b1561163557806040516303622bc560e21b81526004016105479190613423565b6040805180820190915260078152660756e69737761760cc1b6020918201528551908601207f5d5fcba6e8e389400ba7e8ccf3ef1060750f8fee5ccffa48c4afe76443818ece016116935761168e8484610bb8856123c0565b6116f9565b6040805180820190915260098152686165726f64726f6d6560b81b6020918201528551908601207f3a8f193e80a84397be4efa806b030e87a0bbfff98eb2426709b27a64ab32da2d016116f9576040516305fcd0f760e01b815260040160405180910390fd5b5050505050565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176d9190613436565b905090565b61177a611cdf565b6001600160a01b0381166117a457604051631e4fbdf760e01b815260006004820152602401610547565b6117ad81611d0c565b50565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590526000919087169063095ea7b3906044016020604051808303816000875af1158015611823573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611847919061344f565b5060408051610100810182526001600160a01b0388811682528781166020830190815262ffffff8681168486019081523060608601908152426080870190815260a087018c815260c088018c8152600060e08a01908152995163414bf38960e01b815289518916600482015296518816602488015293519094166044860152905185166064850152516084840152905160a48301525160c48201529251811660e484015290917f00000000000000000000000000000000000000000000000000000000000000009091169063414bf38990610104016020604051808303816000875af115801561193b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195f9190613436565b604080516001600160a01b038a811682528981166020830152918101889052606081018390529193507f000000000000000000000000000000000000000000000000000000000000000016907fad56699d0f375866eb895ed27203058a36a713382aaded78eb6b67da266d43329060800160405180910390a25095945050505050565b60015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905260009184169063095ea7b3906044016020604051808303816000875af1158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b919061344f565b905080611aba5760405162461bcd60e51b815260206004820152602760248201527f417070726f76616c206f6620617373657420696e746f204161766520706f6f6c6044820152660819985a5b195960ca1b6064820152608401610547565b60015460405163617ba03760e01b81526001600160a01b03858116600483015260248201859052306044830152600060648301529091169063617ba03790608401600060405180830381600087803b158015611b1557600080fd5b505af1158015611b29573d6000803e3d6000fd5b505050507f76bfb501e0568602c59c0cffcde817c5bc2696480830199d9f8c115afe02c54e8383604051611b5e92919061346a565b60405180910390a1505050565b60025460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905260009184169063095ea7b3906044016020604051808303816000875af1158015611bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be4919061344f565b905080611c425760405162461bcd60e51b815260206004820152602660248201527f417070726f76616c206f6620617373657420696e746f20436f6d706f756e642060448201526519985a5b195960d21b6064820152608401610547565b600254604051634232cd6360e01b81523060048201526001600160a01b0385811660248301526044820185905290911690634232cd6390606401600060405180830381600087803b158015611c9657600080fd5b505af1158015611caa573d6000803e3d6000fd5b505050507f76bfb501e0568602c59c0cffcde817c5bc2696480830199d9f8c115afe02c54e8383604051611b5e92919061349e565b6000546001600160a01b03163314610ac55760405163118cdaa760e01b8152336004820152602401610547565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080611d676103fc565b5050505050905082811015611d8e5760405162461bcd60e51b8152600401610547906134d6565b600154604051631a4ca37b60e21b81526001600160a01b03868116600483015260248201869052306044830152909116906369328dec906064016020604051808303816000875af1158015611de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0b9190613436565b91507ff2119ac293790f480d31afd7d613930c9e10d9432d0dedb82738f50368fa27b58484604051611e3e92919061346a565b60405180910390a15092915050565b600080611e58611700565b905082811015611e7a5760405162461bcd60e51b8152600401610547906134d6565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a0823190602401602060405180830381865afa158015611ec1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee59190613436565b60025460405163f3fef3a360e01b81526001600160a01b0388811660048301526024820188905292935091169063f3fef3a390604401600060405180830381600087803b158015611f3557600080fd5b505af1158015611f49573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b03881691506370a0823190602401602060405180830381865afa158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb89190613436565b9050611fc482826133b7565b93507ff2119ac293790f480d31afd7d613930c9e10d9432d0dedb82738f50368fa27b58685604051611ff792919061349e565b60405180910390a150505092915050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828a8a886040518463ffffffff1660e01b815260040161205b9392919061316b565b602060405180830381865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190613193565b90506001600160a01b0381166120c45760405162461bcd60e51b8152600401610547906131b0565b600080896001600160a01b03168b6001600160a01b0316106120e757898b6120ea565b8a8a5b915091506000826001600160a01b03168c6001600160a01b03161461210f5788612111565b895b90506000836001600160a01b03168d6001600160a01b031614612134578a612136565b895b60405163095ea7b360e01b81526001600160a01b038781166004830152602482018590529192509085169063095ea7b3906044016020604051808303816000875af1158015612189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ad919061344f565b5060405163095ea7b360e01b81526001600160a01b0386811660048301526024820183905284169063095ea7b3906044016020604051808303816000875af11580156121fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612221919061344f565b506000856001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa158015612262573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228691906131fe565b505050505050905060006122998a6126af565b905060006122a68a6126af565b90506122b58383838888612af1565b9850600080896001600160a01b0316633c8a7d8d308f8f8f306040516020016122ed91906001600160a01b0391909116815260200190565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161231c959493929190613518565b60408051808303816000875af115801561233a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235e9190613565565b91509150896001600160a01b03167fce0669c03a6bebf1a7a80046c110092cafdff0bb527ff2e4ea213faf8f07cf118a8a8e86866040516123a3959493929190613589565b60405180910390a250505050505050505050979650505050505050565b604051630b4c774160e11b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631698ee82906124139088908890889060040161316b565b602060405180830381865afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124549190613193565b90506001600160a01b03811661247c5760405162461bcd60e51b8152600401610547906131b0565b600080856001600160a01b0316876001600160a01b03161061249f5785876124a2565b86865b91509150600080846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa1580156124e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250b91906131fe565b505050505091509150600060648261252391906132a7565b905060006125328360646132d2565b60405163a34123a760e01b8152600284810b600483015282900b60248201526001600160801b038a16604482015290915060009081906001600160a01b038a169063a34123a79060640160408051808303816000875af115801561259a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125be9190613565565b6040516309e3d67b60e31b8152306004820152600287810b602483015286900b60448201526001600160801b0380841660648301528216608482015291935091506001600160a01b038a1690634f1eb3d89060a40160408051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265591906135c3565b5050886001600160a01b03167ff0c5c8e0b584b9430fbe397d62831fc7eca3e734a39a08659847de97469501de89898d8686604051612698959493929190613589565b60405180910390a250505050505050505050505050565b6000620d89e719600283900b128015906126db57506126d1620d89e7196135f6565b60020b8260020b13155b6127165760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207469636b60a01b6044820152606401610547565b6000808360020b1261272b578260020b612738565b8260020b61273890613618565b905060008160011660000361275157600160801b612763565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156127a257608061279d826ffff97272373d413259a46990580e213a613634565b901c90505b60048216156127cc5760806127c7826ffff2e50f5f656932ef12357cf3c7fdcc613634565b901c90505b60088216156127f65760806127f1826fffe5caca7e10e4e61c3624eaa0941cd0613634565b901c90505b601082161561282057608061281b826fffcb9843d60f6159c9db58835c926644613634565b901c90505b602082161561284a576080612845826fff973b41fa98c081472e6896dfb254c0613634565b901c90505b604082161561287457608061286f826fff2ea16466c96a3843ec78b326b52861613634565b901c90505b608082161561289e576080612899826ffe5dee046a99a2a811c461f1969c3053613634565b901c90505b6101008216156128c95760806128c4826ffcbe86c7900a88aedcffc83b479aa3a4613634565b901c90505b6102008216156128f45760806128ef826ff987a7253ac413176f2b074cf7815e54613634565b901c90505b61040082161561291f57608061291a826ff3392b0822b70005940c7a398e4b70f3613634565b901c90505b61080082161561294a576080612945826fe7159475a2c29b7443b29c7fa6e889d9613634565b901c90505b611000821615612975576080612970826fd097f3bdfd2022b8845ad8f792aa5825613634565b901c90505b6120008216156129a057608061299b826fa9f746462d870fdf8a65dc1f90e061e5613634565b901c90505b6140008216156129cb5760806129c6826f70d869a156d2a1b890bb3df62baf32f7613634565b901c90505b6180008216156129f65760806129f1826f31be135f97d08fd981231505542fcfa6613634565b901c90505b62010000821615612a22576080612a1d826f09aa508b5b7a84e1c677de54f3e99bc9613634565b901c90505b62020000821615612a4d576080612a48826e5d6af8dedb81196699c329225ee604613634565b901c90505b62040000821615612a77576080612a72826d2216e584f5fa1ea926041bedfe98613634565b901c90505b62080000821615612a9f576080612a9a826b048a170391f7dc42444e8fa2613634565b901c90505b60008460020b1315612aba57612ab781600019613661565b90505b612ac964010000000082613675565b15612ad5576001612ad8565b60005b612ae99060ff16602083901c6133ca565b949350505050565b6000836001600160a01b0316856001600160a01b03161115612b11579293925b846001600160a01b0316866001600160a01b031611612b3c57612b35858585612bb5565b9050612bac565b836001600160a01b0316866001600160a01b03161015612b9e576000612b63878686612bb5565b90506000612b72878986612c2a565b9050806001600160801b0316826001600160801b031610612b935780612b95565b815b92505050612bac565b612ba9858584612c2a565b90505b95945050505050565b6000826001600160a01b0316846001600160a01b03161115612bd5579192915b6000612bf8856001600160a01b0316856001600160a01b0316600160601b612c60565b9050612c1f612c1a8483612c0c8989613689565b6001600160a01b0316612c60565b612dd9565b9150505b9392505050565b6000826001600160a01b0316846001600160a01b03161115612c4a579192915b612ae9612c1a83600160601b612c0c8888613689565b6000808060001985870985870292508281108382030391505080600003612c995760008411612c8e57600080fd5b508290049050612c23565b808411612ca557600080fd5b6000848688098084039381119092039190506000612cc5861960016133ca565b8616958690049593849004936000819003046001019050612ce68184613634565b909317926000612cf7876003613634565b6002189050612d068188613634565b612d119060026133b7565b612d1b9082613634565b9050612d278188613634565b612d329060026133b7565b612d3c9082613634565b9050612d488188613634565b612d539060026133b7565b612d5d9082613634565b9050612d698188613634565b612d749060026133b7565b612d7e9082613634565b9050612d8a8188613634565b612d959060026133b7565b612d9f9082613634565b9050612dab8188613634565b612db69060026133b7565b612dc09082613634565b9050612dcc8186613634565b9998505050505050505050565b806001600160801b0381168114612def57600080fd5b919050565b6001600160a01b03811681146117ad57600080fd5b803562ffffff81168114612def57600080fd5b600080600060608486031215612e3157600080fd5b8335612e3c81612df4565b92506020840135612e4c81612df4565b9150612e5a60408501612e09565b90509250925092565b60008060008060808587031215612e7957600080fd5b8435612e8481612df4565b93506020850135612e9481612df4565b925060408501359150612ea960608601612e09565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612edb57600080fd5b813567ffffffffffffffff80821115612ef657612ef6612eb4565b604051601f8301601f19908116603f01168101908282118183101715612f1e57612f1e612eb4565b81604052838152866020858801011115612f3757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612f6c57600080fd5b833567ffffffffffffffff811115612f8357600080fd5b612f8f86828701612eca565b9350506020840135612fa081612df4565b929592945050506040919091013590565b600060208284031215612fc357600080fd5b8135612c2381612df4565b60008060408385031215612fe157600080fd5b8235612fec81612df4565b946020939093013593505050565b8060020b81146117ad57600080fd5b600080600080600080600080610100898b03121561302657600080fd5b883567ffffffffffffffff81111561303d57600080fd5b6130498b828c01612eca565b985050602089013561305a81612df4565b9650604089013561306a81612df4565b9550606089013594506080890135935061308660a08a01612e09565b925060c089013561309681612ffa565b915060e08901356130a681612ffa565b809150509295985092959890939650565b600080600080608085870312156130cd57600080fd5b843567ffffffffffffffff8111156130e457600080fd5b6130f087828801612eca565b945050602085013561310181612df4565b9250604085013561311181612df4565b9396929550929360600135925050565b60008060008060008060c0878903121561313a57600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6000602082840312156131a557600080fd5b8151612c2381612df4565b602080825260129082015271141bdbdb08191bd95cdb89dd08195e1a5cdd60721b604082015260600190565b805161ffff81168114612def57600080fd5b80518015158114612def57600080fd5b600080600080600080600060e0888a03121561321957600080fd5b875161322481612df4565b602089015190975061323581612ffa565b9550613243604089016131dc565b9450613251606089016131dc565b935061325f608089016131dc565b925060a088015160ff8116811461327557600080fd5b915061328360c089016131ee565b905092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b600282810b9082900b03627fffff198112627fffff821317156132cc576132cc613291565b92915050565b600281810b9083900b01627fffff8113627fffff19821217156132cc576132cc613291565b80516001600160801b0381168114612def57600080fd5b600080600080600060a0868803121561332657600080fd5b61332f866132f7565b9450602086015193506040860151925061334b606087016132f7565b9150613359608087016132f7565b90509295509295909350565b6020808252600a908201526913db9b1e481859d95b9d60b21b604082015260600190565b602080825260149082015273496e73756666696369656e742062616c616e636560601b604082015260600190565b818103818111156132cc576132cc613291565b808201808211156132cc576132cc613291565b6000815180845260005b81811015613403576020818501810151868301820152016133e7565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612c2360208301846133dd565b60006020828403121561344857600080fd5b5051919050565b60006020828403121561346157600080fd5b612c23826131ee565b6060808252600490820152634161766560e01b60808201526001600160a01b03929092166020830152604082015260a00190565b60608082526008908201526710dbdb5c1bdd5b9960c21b60808201526001600160a01b03929092166020830152604082015260a00190565b60208082526022908201527f43616e6e6f74207769746864726177206d6f7265207468616e20626f72726f77604082015261195960f21b606082015260800190565b60018060a01b03861681528460020b60208201528360020b60408201526001600160801b038316606082015260a06080820152600061355a60a08301846133dd565b979650505050505050565b6000806040838503121561357857600080fd5b505080516020909101519092909150565b6001600160a01b0395861681529390941660208401526001600160801b039190911660408301526060820152608081019190915260a00190565b600080604083850312156135d657600080fd5b6135df836132f7565b91506135ed602084016132f7565b90509250929050565b60008160020b627fffff19810361360f5761360f613291565b60000392915050565b6000600160ff1b820161362d5761362d613291565b5060000390565b80820281158282048414176132cc576132cc613291565b634e487b7160e01b600052601260045260246000fd5b6000826136705761367061364b565b500490565b6000826136845761368461364b565b500690565b6001600160a01b038281168282160390808211156136a9576136a9613291565b509291505056fea2646970667358221220a3e658e993430ca9253841754cb27b4fca331c7c702af9bee59b01b0c2eccc4564736f6c63430008160033a2646970667358221220de6f151a0a324d3d7baddd11cfe6c03608330881e9115e4188f3d0d0db83074064736f6c63430008160033", + "nonce": "0x1", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x8078fc", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4bcd3ea0a755da46d20fa618e7b7aa1bfb335bcb161203df48bb164193235b0d", + "transactionIndex": "0x21", + "blockHash": "0x64dc3ab57f4570a4126797625cf89d3af7a2333fe74b9180a8886dd72be1c543", + "blockNumber": "0x149d03a", + "gasUsed": "0x3aa811", + "effectiveGasPrice": "0xe15d4", + "from": "0x7e393441edc1bb1621318e000cdfc74947f23b26", + "to": null, + "contractAddress": "0xba31d235cf7f92f857fe891b630110efe1e47002", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0xf91ad7fe4b", + "l1GasPrice": "0x1b7591874", + "l1GasUsed": "0x202f9" + } + ], + "libraries": [], + "pending": [], + "returns": { + "0": { + "internal_type": "contract VaultFactory", + "value": "0xbA31d235cF7F92f857FE891B630110EFe1e47002" + } + }, + "timestamp": 1738997609, + "chain": 84532, + "commit": "8832140" +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 9071438..433b53e 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,4 +1,7 @@ [profile.default] +solc_version = "0.8.22" +optimizer = true +optimizer_runs = 200 src = "src" out = "out" libs = ["lib"] @@ -10,7 +13,16 @@ remappings = [ "@uniswap/v3-periphery/contracts/=lib/v3-periphery/contracts/", "@uniswap/v3-core/contracts/=lib/v3-core/contracts/", "@aave/v3-core/contracts=lib/aave-v3-core/contracts", - "@compound/contracts=lib/comet/contracts" + "@compound/contracts=lib/comet/contracts", ] -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options +fuzz_runs = 1000 + +[profile.ci] +verbosity = 4 + +gas_reports = ["cento"] + + +[etherscan] +84532 = { key = "${API_KEY}", url = "https://api-sepolia.basescan.org/api" } diff --git a/script/DeployVaultFactory.s.sol b/script/DeployVaultFactory.s.sol new file mode 100644 index 0000000..79b859c --- /dev/null +++ b/script/DeployVaultFactory.s.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import {Script} from "forge-std/Script.sol"; +import {VaultFactory} from "../src/VaultFactory.sol"; + +contract DeployVaultFactory is Script { + function run() external returns (VaultFactory) { + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + + // Deploy VaultFactory with the owner set to msg.sender + VaultFactory vaultFactory = new VaultFactory(); + + vm.stopBroadcast(); + + return (vaultFactory); + } +} diff --git a/script/HelperConfig.s.sol b/script/HelperConfig.s.sol index 7347be5..0747088 100644 --- a/script/HelperConfig.s.sol +++ b/script/HelperConfig.s.sol @@ -22,7 +22,7 @@ contract HelperConfig is Script { address uniswapRouter; //Uniswap V3 address uniswapQouter; // Uniswap V3 address aavePool; // Aave V3 - address vault; + address agent; } /*////////////////////////////////////////////////////////////// @@ -38,7 +38,7 @@ contract HelperConfig is Script { uniswapRouter: 0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4, uniswapQouter: 0xC5290058841028F1614F3A6F0F5816cAd0df5E27, aavePool: 0xbE781D7Bdf469f3d94a62Cdcc407aCe106AEcA74, - vault: address(123) + agent: address(77) }); return BaseSepoliaConfig; } @@ -53,7 +53,7 @@ contract HelperConfig is Script { uniswapRouter: address(0), uniswapQouter: address(0), aavePool: 0x8B9b2AF4afB389b4a70A474dfD4AdCD4a302bb40, - vault: address(123) + agent: address(77) }); return AvaxFujiConfig; } @@ -68,7 +68,7 @@ contract HelperConfig is Script { uniswapRouter: address(0), uniswapQouter: address(0), aavePool: 0x6Ae43d3271ff6888e7Fc43Fd7321a503ff738951, - vault: address(123) + agent: address(77) }); return ETHSepoliaConfig; } @@ -87,7 +87,7 @@ contract HelperConfig is Script { uniswapRouter: address(3), uniswapQouter: address(6), aavePool: address(7), - vault: address(123) + agent: address(77) }); return AnvilConfig; } diff --git a/src/Counter.sol b/src/Counter.sol deleted file mode 100644 index aded799..0000000 --- a/src/Counter.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -contract Counter { - uint256 public number; - - function setNumber(uint256 newNumber) public { - number = newNumber; - } - - function increment() public { - number++; - } -} diff --git a/src/LiquidityManager.sol b/src/LiquidityManager.sol index 816c913..de93d15 100644 --- a/src/LiquidityManager.sol +++ b/src/LiquidityManager.sol @@ -16,14 +16,12 @@ import {LiquidityAmounts} from "./lib/LiquidityAmounts.sol"; * @author Cento-AI * @notice Contract that integrates with aave and compound protocols to supply and withdraw liquidity. * @notice Contract to handle token swaps and liquidity additions on Uniswap. - * @notice This contract uses a vault mechanism for manage user funds for maximizing returns. + * @notice This contract is inherited by the Cento-AI Vault contract. + * @notice This contract can only be used by the Cento-AI Vault contract. * @dev Integrates with a vault to manage user funds for swaps and liquidity. * @dev For compound finance, only USDC investment is available for now. */ contract LiquidityManager { - /// @notice Cento-AI Vault contract address - address public vault; - /// @notice Aave V3 components IPool public aavePool; @@ -36,102 +34,121 @@ contract LiquidityManager { /// @notice Uniswap V3 events event TokensSwapped( - address indexed protocol, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut + address indexed protocol, + address tokenIn, + address tokenOut, + uint256 amountIn, + uint256 amountOut ); /// @notice For two token(uniswap) event LiquidityAdded( - address indexed pool, address token0, address token1, uint128 liquidity, uint256 amount0, uint256 amount1 + address indexed pool, + address token0, + address token1, + uint128 liquidity, + uint256 amount0, + uint256 amount1 ); /// @notice For two token(uniswap) event LiquidityRemoved( - address indexed pool, address token0, address token1, uint128 liquidity, uint256 amount0, uint256 amount1 + address indexed pool, + address token0, + address token1, + uint128 liquidity, + uint256 amount0, + uint256 amount1 ); /// @notice For single token(aave, compound) - event LiquiditySupplied(string protocol, address asset, uint256 amount, address user); + event LiquiditySupplied(string protocol, address asset, uint256 amount); + + /// @notice For single token(aave, compound) + event LiquidityWithdrawn(string protocol, address asset, uint256 amount); /** * @param _aavePool Aave V3 pool address. * @param _compoundUsdc Compound USDC address.(Currently only USDC supported for compound). * @param _uniswapRouter Uniswap V3 router address. * @param _uniswapFactory Uniswap V3 factory address. - * @param _vault Vault address to manage user funds. * @dev Constructor to set the addresses of the Aave pool, Compound USDC, Uniswap router, Uniswap factory, and vault. */ constructor( address _aavePool, address _compoundUsdc, address _uniswapRouter, - address _uniswapFactory, - address _vault + address _uniswapFactory ) { aavePool = IPool(_aavePool); compoundUsdc = CometMainInterface(_compoundUsdc); uniswapRouter = ISwapRouter(_uniswapRouter); uniswapFactory = IUniswapV3Factory(_uniswapFactory); - vault = _vault; } /** * @notice Supply liquidity on Aave V3(single token). - * @notice Caller must approve the asset to be spent. * @param _asset Asset to supply liquidity on. * @param _amount Amount of asset to supply. */ - function supplyLiquidityOnAave(address _asset, uint256 _amount) external { - require(IERC20(_asset).allowance(msg.sender, address(this)) >= _amount, "Insufficient allowance"); - bool approvedUser = IERC20(_asset).transferFrom(msg.sender, address(this), _amount); - require(approvedUser, "Transfer of asset into this contract failed"); + function supplyLiquidityOnAave(address _asset, uint256 _amount) internal { bool approvedAave = IERC20(_asset).approve(address(aavePool), _amount); require(approvedAave, "Approval of asset into Aave pool failed"); - aavePool.supply(_asset, _amount, msg.sender, 0); - emit LiquiditySupplied("Aave", _asset, _amount, msg.sender); + aavePool.supply(_asset, _amount, address(this), 0); + emit LiquiditySupplied("Aave", _asset, _amount); } /** * @notice Supply liquidity on Compound(single token). - * @notice Caller must approve the asset to be spent. * @param _asset Asset to supply liquidity on. * @param _amount Amount of asset to supply. */ - function supplyLiquidityOnCompound(address _asset, uint256 _amount) external { - require(IERC20(_asset).allowance(msg.sender, address(this)) >= _amount, "Insufficient allowance"); - bool approvedUser = IERC20(_asset).transferFrom(msg.sender, address(this), _amount); - require(approvedUser, "Transfer of asset into this contract failed"); - bool approvedCompound = IERC20(_asset).approve(address(compoundUsdc), _amount); + function supplyLiquidityOnCompound( + address _asset, + uint256 _amount + ) internal { + bool approvedCompound = IERC20(_asset).approve( + address(compoundUsdc), + _amount + ); require(approvedCompound, "Approval of asset into Compound failed"); - compoundUsdc.supplyTo(msg.sender, _asset, _amount); - emit LiquiditySupplied("Compound", _asset, _amount, msg.sender); + compoundUsdc.supplyTo(address(this), _asset, _amount); + emit LiquiditySupplied("Compound", _asset, _amount); } /** * @notice Withdraw liquidity from Aave V3(single token). * @param _asset Asset to withdraw liquidity from. - * @param _aaveAsset Aave asset to withdraw. * @param _amount Amount of asset to withdraw. + * @return amountWithdrawn Amount of asset withdrawn. */ - function withdrawLiquidityFromAave(address _asset, address _aaveAsset, uint256 _amount) - external - returns (uint256 amountWithdrawn) - { - (uint256 collateral,,,,,) = getAaveLiquidityStatus(msg.sender); + function withdrawLiquidityFromAave( + address _asset, + uint256 _amount + ) internal returns (uint256 amountWithdrawn) { + (uint256 collateral, , , , , ) = getAaveLiquidityStatus(); require(collateral >= _amount, "Cannot withdraw more than borrowed"); - bool success = IERC20(_aaveAsset).transferFrom(msg.sender, address(this), _amount); - require(success, "Transfer of aave asset into this contract failed"); - amountWithdrawn = aavePool.withdraw(_asset, _amount, msg.sender); + amountWithdrawn = aavePool.withdraw(_asset, _amount, address(this)); + emit LiquidityWithdrawn("Aave", _asset, _amount); } /** * @notice Withdraw liquidity from Compound(single token). * @param _asset Asset to withdraw liquidity from. * @param _amount Amount of asset to withdraw. + * @return amountWithdrawn Amount of asset withdrawn. */ - function withdrawLiquidityFromCompound(address _asset, uint256 _amount) external { - uint256 collateral = getCompoundLiquidityStatus(msg.sender); + function withdrawLiquidityFromCompound( + address _asset, + uint256 _amount + ) internal returns (uint256 amountWithdrawn) { + uint256 collateral = getCompoundLiquidityStatus(); require(collateral >= _amount, "Cannot withdraw more than borrowed"); - compoundUsdc.withdrawFrom(msg.sender, address(this), _asset, _amount); + uint256 collateralBefore = IERC20(_asset).balanceOf(address(this)); + compoundUsdc.withdraw(_asset, _amount); + uint256 collateralAfter = IERC20(_asset).balanceOf(address(this)); + amountWithdrawn = collateralAfter - collateralBefore; + emit LiquidityWithdrawn("Compound", _asset, amountWithdrawn); } /** @@ -143,29 +160,37 @@ contract LiquidityManager { * @param fee fee tier for the swap. * @return amountOut amount of tokenOut received. */ - function swapOnUniswap(address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, uint24 fee) - external - returns (uint256 amountOut) - { - /// @dev Transfer from vault and approve. - require(IERC20(tokenIn).transferFrom(vault, address(this), amountIn), "Vault transfer failed"); + function swapOnUniswap( + address tokenIn, + address tokenOut, + uint256 amountIn, + uint256 amountOutMin, + uint24 fee + ) internal returns (uint256 amountOut) { IERC20(tokenIn).approve(address(uniswapRouter), amountIn); /// @dev Execute swap. - ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ - tokenIn: tokenIn, - tokenOut: tokenOut, - fee: fee, - recipient: vault, - /// @dev Output to vault - deadline: block.timestamp, - amountIn: amountIn, - amountOutMinimum: amountOutMin, - sqrtPriceLimitX96: 0 - }); + ISwapRouter.ExactInputSingleParams memory params = ISwapRouter + .ExactInputSingleParams({ + tokenIn: tokenIn, + tokenOut: tokenOut, + fee: fee, + recipient: address(this), + /// @dev Output to vault + deadline: block.timestamp, + amountIn: amountIn, + amountOutMinimum: amountOutMin, + sqrtPriceLimitX96: 0 + }); amountOut = uniswapRouter.exactInputSingle(params); - emit TokensSwapped(address(uniswapRouter), tokenIn, tokenOut, amountIn, amountOut); + emit TokensSwapped( + address(uniswapRouter), + tokenIn, + tokenOut, + amountIn, + amountOut + ); } /** @@ -178,7 +203,7 @@ contract LiquidityManager { * @param tickLower Lower tick boundary * @param tickUpper Upper tick boundary */ - function addLiquidityToPool( + function supplyLiquidityOnUniswap( address tokenA, address tokenB, uint256 amountADesired, @@ -186,46 +211,58 @@ contract LiquidityManager { uint24 fee, int24 tickLower, int24 tickUpper - ) external returns (uint128 liquidity) { + ) internal returns (uint128 liquidity) { /// @dev Get pool address. address pool = uniswapFactory.getPool(tokenA, tokenB, fee); require(pool != address(0), "Pool doesn't exist"); /// @dev Sort tokens. - (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); + (address token0, address token1) = tokenA < tokenB + ? (tokenA, tokenB) + : (tokenB, tokenA); /// @dev Transfer tokens from vault. uint256 amount0 = tokenA == token0 ? amountADesired : amountBDesired; uint256 amount1 = tokenA == token0 ? amountBDesired : amountADesired; - require(IERC20(token0).transferFrom(vault, address(this), amount0), "Token0 transfer failed"); - require(IERC20(token1).transferFrom(vault, address(this), amount1), "Token1 transfer failed"); - /// @dev Approve pool. IERC20(token0).approve(pool, amount0); IERC20(token1).approve(pool, amount1); /// @dev Get current pool price. - (uint160 sqrtPriceX96,,,,,,) = IUniswapV3Pool(pool).slot0(); + (uint160 sqrtPriceX96, , , , , , ) = IUniswapV3Pool(pool).slot0(); /// @dev Calculate liquidity using Uniswap libraries. uint160 sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower); uint160 sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper); - liquidity = - LiquidityAmounts.getLiquidityForAmounts(sqrtPriceX96, sqrtRatioAX96, sqrtRatioBX96, amount0, amount1); + liquidity = LiquidityAmounts.getLiquidityForAmounts( + sqrtPriceX96, + sqrtRatioAX96, + sqrtRatioBX96, + amount0, + amount1 + ); /// @dev Add liquidity directly to pool. - (uint256 amount0Actual, uint256 amount1Actual) = IUniswapV3Pool(pool).mint( - address(this), - /// @dev Recipient (this contract) - tickLower, - tickUpper, - liquidity, - abi.encode(msg.sender) - ); + (uint256 amount0Actual, uint256 amount1Actual) = IUniswapV3Pool(pool) + .mint( + address(this), + /// @dev Recipient (this contract) + tickLower, + tickUpper, + liquidity, + abi.encode(address(this)) + ); /// @dev Callback data - emit LiquidityAdded(pool, token0, token1, liquidity, amount0Actual, amount1Actual); + emit LiquidityAdded( + pool, + token0, + token1, + liquidity, + amount0Actual, + amount1Actual + ); } /** @@ -235,35 +272,57 @@ contract LiquidityManager { * @param _fee Pool fee tier * @param _liquidityToRemove Amount of liquidity to remove */ - function withdrawLiquidityFromUniswap(address _tokenA, address _tokenB, uint24 _fee, uint128 _liquidityToRemove) - external - { + function withdrawLiquidityFromUniswap( + address _tokenA, + address _tokenB, + uint24 _fee, + uint128 _liquidityToRemove + ) internal { // Get pool address address pool = uniswapFactory.getPool(_tokenA, _tokenB, _fee); require(pool != address(0), "Pool doesn't exist"); // Sort tokens - (address token0, address token1) = _tokenA < _tokenB ? (_tokenA, _tokenB) : (_tokenB, _tokenA); + (address token0, address token1) = _tokenA < _tokenB + ? (_tokenA, _tokenB) + : (_tokenB, _tokenA); // Get current pool price and tick - (uint160 sqrtPriceX96, int24 tick,,,,,) = IUniswapV3Pool(pool).slot0(); + (uint160 sqrtPriceX96, int24 tick, , , , , ) = IUniswapV3Pool(pool) + .slot0(); // Determine tick range (you might want to adjust this based on your specific requirements) int24 tickLower = tick - 100; int24 tickUpper = tick + 100; // Burn liquidity - (uint256 amount0, uint256 amount1) = IUniswapV3Pool(pool).burn(tickLower, tickUpper, _liquidityToRemove); + (uint256 amount0, uint256 amount1) = IUniswapV3Pool(pool).burn( + tickLower, + tickUpper, + _liquidityToRemove + ); // Collect tokens to vault - IUniswapV3Pool(pool).collect(vault, tickLower, tickUpper, uint128(amount0), uint128(amount1)); + IUniswapV3Pool(pool).collect( + address(this), + tickLower, + tickUpper, + uint128(amount0), + uint128(amount1) + ); - emit LiquidityRemoved(pool, token0, token1, _liquidityToRemove, amount0, amount1); + emit LiquidityRemoved( + pool, + token0, + token1, + _liquidityToRemove, + amount0, + amount1 + ); } /** * @notice Returns the user account data across all the reserves - * @param _user The address of the user * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed * @return totalDebtBase The total debt of the user in the base currency used by the price feed * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed @@ -271,7 +330,7 @@ contract LiquidityManager { * @return ltv The loan to value of The user * @return healthFactor The current health factor of the user */ - function getAaveLiquidityStatus(address _user) + function getAaveLiquidityStatus() public view returns ( @@ -283,21 +342,23 @@ contract LiquidityManager { uint256 healthFactor ) { - return aavePool.getUserAccountData(_user); + return aavePool.getUserAccountData(address(this)); } /** * @notice Get the user's compound liquidity status. - * @param _user The address of the user. * @return balance The user's compound liquidity balance. */ - function getCompoundLiquidityStatus(address _user) public view returns (uint256 balance) { - balance = compoundUsdc.balanceOf(_user); + function getCompoundLiquidityStatus() + public + view + returns (uint256 balance) + { + balance = compoundUsdc.balanceOf(address(this)); } /** * @notice Get Uniswap V3 liquidity position details - * @param _user Address of the user * @param _tokenA First token in the pair * @param _tokenB Second token in the pair * @param _fee Pool fee tier @@ -305,7 +366,11 @@ contract LiquidityManager { * @return amount0 Current amount of token0 in the position * @return amount1 Current amount of token1 in the position */ - function getUniswapLiquidityStatus(address _user, address _tokenA, address _tokenB, uint24 _fee) + function getUniswapLiquidityStatus( + address _tokenA, + address _tokenB, + uint24 _fee + ) public view returns (uint128 liquidity, uint256 amount0, uint256 amount1) @@ -315,18 +380,22 @@ contract LiquidityManager { require(pool != address(0), "Pool doesn't exist"); // Sort tokens - (address token0, address token1) = _tokenA < _tokenB ? (_tokenA, _tokenB) : (_tokenB, _tokenA); + (address token0, address token1) = _tokenA < _tokenB + ? (_tokenA, _tokenB) + : (_tokenB, _tokenA); // Get current pool price and tick - (uint160 sqrtPriceX96, int24 tick,,,,,) = IUniswapV3Pool(pool).slot0(); + (uint160 sqrtPriceX96, int24 tick, , , , , ) = IUniswapV3Pool(pool) + .slot0(); // Determine tick range (you might want to adjust this based on your specific requirements) int24 tickLower = tick - 100; int24 tickUpper = tick + 100; // Destructure only the first three values - (liquidity, amount0, amount1,,) = - IUniswapV3Pool(pool).positions(keccak256(abi.encodePacked(_user, tickLower, tickUpper))); + (liquidity, amount0, amount1, , ) = IUniswapV3Pool(pool).positions( + keccak256(abi.encodePacked(address(this), tickLower, tickUpper)) + ); return (liquidity, amount0, amount1); } diff --git a/src/Vault.sol b/src/Vault.sol index 9819552..164ce47 100644 --- a/src/Vault.sol +++ b/src/Vault.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.22; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; +import "./LiquidityManager.sol"; /** * @title Vault @@ -11,36 +12,76 @@ import "@openzeppelin/contracts/access/Ownable.sol"; * @dev It allows users to deposit and withdraw ERC20 tokens. * @dev It also allows users to get their balance of a specific token. */ -contract Vault is Ownable(msg.sender) { - /// @notice Liquidity manager address. - address public liquidityManager; +contract Vault is Ownable, LiquidityManager { + address public agent; - /// @notice Mapping of user address to token address to balance. - mapping(address => mapping(address => uint256)) - public userAddressToBalances; + struct UserBalance { + address asset; + uint256 balance; + uint256 investedInAave; + uint256 investedInCompound; + uint256 investedInUniswap; + } - event ERC20Deposited( - address indexed user, - address indexed token, - uint256 amount - ); - event ERC20Withdrawn( - address indexed user, - address indexed token, - uint256 amount - ); + /// @notice Mapping of user address to token address to struct. + mapping(address => UserBalance) public tokenAddressToStruct; + + event ERC20Deposited(address indexed token, uint256 amount); + event ERC20Withdrawn(address indexed token, uint256 amount); + + error InvalidProtocol(string protocol); + error AerodromeNotImplemented(); + + modifier onlyAgent() { + require(msg.sender == agent, "Only agent"); + _; + } + + modifier validLendingProtocol(string memory protocol) { + if ( + keccak256(bytes(protocol)) != keccak256(bytes("aave")) && + keccak256(bytes(protocol)) != keccak256(bytes("compound")) + ) { + revert InvalidProtocol(protocol); + } + _; + } - modifier onlyLiquidityManager() { - require(msg.sender == liquidityManager, "Only liquidity manager"); + modifier validLPProtocol(string memory protocol) { + if ( + keccak256(bytes(protocol)) != keccak256(bytes("uniswap")) && + keccak256(bytes(protocol)) != keccak256(bytes("aerodrome")) + ) { + revert InvalidProtocol(protocol); + } _; } + constructor( + address _owner, + address _agent, + address _aavePool, + address _compoundUsdc, + address _uniswapRouter, + address _uniswapFactory + ) + Ownable(_owner) + LiquidityManager( + _aavePool, + _compoundUsdc, + _uniswapRouter, + _uniswapFactory + ) + { + agent = _agent; + } + /** * @notice Deposit ERC20 tokens into the vault. * @param _token Token address to deposit. * @param _amount Amount of token to deposit. */ - function depositERC20(address _token, uint256 _amount) external { + function depositERC20(address _token, uint256 _amount) external onlyOwner { require( IERC20(_token).allowance(msg.sender, address(this)) >= _amount, "Insufficient allowance" @@ -51,8 +92,8 @@ contract Vault is Ownable(msg.sender) { _amount ); require(success, "Transfer failed"); - userAddressToBalances[msg.sender][_token] += _amount; - emit ERC20Deposited(msg.sender, _token, _amount); + tokenAddressToStruct[_token].balance += _amount; + emit ERC20Deposited(_token, _amount); } /** @@ -60,59 +101,162 @@ contract Vault is Ownable(msg.sender) { * @param _token Token address to withdraw. * @param _amount Amount of token to withdraw. */ - function withdrawERC20(address _token, uint256 _amount) external { + function withdrawERC20(address _token, uint256 _amount) external onlyOwner { require( - userAddressToBalances[msg.sender][_token] >= _amount, + tokenAddressToStruct[_token].balance >= _amount, "Insufficient balance" ); - IERC20(_token).approve(msg.sender, _amount); - IERC20(_token).transferFrom(address(this), msg.sender, _amount); - userAddressToBalances[msg.sender][_token] -= _amount; - emit ERC20Withdrawn(msg.sender, _token, _amount); + IERC20(_token).approve(owner(), _amount); + bool success = IERC20(_token).transfer(owner(), _amount); + require(success, "Transfer failed"); + tokenAddressToStruct[_token].balance -= _amount; + emit ERC20Withdrawn(_token, _amount); } /** - * @notice Set the liquidity manager address. - * @param _liquidityManager Liquidity manager address to set. + * @notice Set the agent address. + * @param _agent Agent address to set. */ - function setLiquidityManager(address _liquidityManager) public onlyOwner { - liquidityManager = _liquidityManager; + function setAgent(address _agent) public onlyOwner { + agent = _agent; } - /** - * @notice Transfer ERC20 tokens to the liquidity manager. - * @param _onBehalfOf Address of the user to transfer the tokens on behalf of to. - * @param _asset Address of the token to transfer. - * @param _amount Amount of tokens to transfer. - */ - function transferERC20ToLiquidityManager( - address _onBehalfOf, - address _asset, - uint256 _amount - ) public onlyLiquidityManager { + function lendTokens( + string memory protocol, + address token, + uint256 amount + ) external onlyAgent validLendingProtocol(protocol) { require( - userAddressToBalances[_onBehalfOf][_asset] >= _amount, + tokenAddressToStruct[token].balance >= amount, "Insufficient balance" ); - userAddressToBalances[_onBehalfOf][_asset] -= _amount; - bool success = IERC20(_asset).transferFrom( - address(this), - liquidityManager, - _amount + + if (keccak256(bytes(protocol)) == keccak256(bytes("aave"))) { + supplyLiquidityOnAave(token, amount); + tokenAddressToStruct[token].investedInAave += amount; + } else if (keccak256(bytes(protocol)) == keccak256(bytes("compound"))) { + supplyLiquidityOnCompound(token, amount); + tokenAddressToStruct[token].investedInCompound += amount; + } + + tokenAddressToStruct[token].balance -= amount; + } + + function withdrawLentTokens( + string memory protocol, + address token, + uint256 amount + ) + external + onlyAgent + validLendingProtocol(protocol) + returns (uint256 amountWithdrawn) + { + if (keccak256(bytes(protocol)) == keccak256(bytes("aave"))) { + require( + tokenAddressToStruct[token].investedInAave >= amount, + "Insufficient invested amount" + ); + amountWithdrawn = withdrawLiquidityFromAave(token, amount); + tokenAddressToStruct[token].investedInAave -= amount; + } else if (keccak256(bytes(protocol)) == keccak256(bytes("compound"))) { + require( + tokenAddressToStruct[token].investedInCompound >= amount, + "Insufficient invested amount" + ); + amountWithdrawn = withdrawLiquidityFromCompound(token, amount); + tokenAddressToStruct[token].investedInCompound -= amount; + } + + tokenAddressToStruct[token].balance += amountWithdrawn; + return amountWithdrawn; + } + + // TODO Add aerodrome + function addLiquidity( + string memory protocol, + address token0, + address token1, + uint256 amount0, + uint256 amount1, + uint24 fee, + int24 tickLower, + int24 tickUpper + ) external onlyAgent validLPProtocol(protocol) { + require( + tokenAddressToStruct[token0].balance >= amount0, + "Insufficient balance token0" ); - require(success, "Transfer failed"); + require( + tokenAddressToStruct[token1].balance >= amount1, + "Insufficient balance token1" + ); + + if (keccak256(bytes(protocol)) == keccak256(bytes("uniswap"))) { + supplyLiquidityOnUniswap( + token0, + token1, + amount0, + amount1, + fee, + tickLower, + tickUpper + ); + tokenAddressToStruct[token0].investedInUniswap += amount0; + tokenAddressToStruct[token1].investedInUniswap += amount1; + } else if ( + keccak256(bytes(protocol)) == keccak256(bytes("aerodrome")) + ) { + revert AerodromeNotImplemented(); + } + + tokenAddressToStruct[token0].balance -= amount0; + tokenAddressToStruct[token1].balance -= amount1; + } + + function removeLiquidity( + string memory protocol, + address token0, + address token1, + uint256 liquidityAmount + ) external onlyAgent validLPProtocol(protocol) { + if (keccak256(bytes(protocol)) == keccak256(bytes("uniswap"))) { + withdrawLiquidityFromUniswap( + token0, + token1, + 3000, // default fee + uint128(liquidityAmount) + ); + } else if ( + keccak256(bytes(protocol)) == keccak256(bytes("aerodrome")) + ) { + revert AerodromeNotImplemented(); + } + } + + function swapOnUniswap( + address _tokenIn, + address _tokenOut, + uint256 _amountIn, + uint24 _fee + ) external onlyAgent returns (uint256 amountOut) { + require( + tokenAddressToStruct[_tokenIn].balance >= _amountIn, + "Insufficient balance" + ); + amountOut = swapOnUniswap(_tokenIn, _tokenOut, _amountIn, 1, _fee); + tokenAddressToStruct[_tokenIn].balance -= _amountIn; + tokenAddressToStruct[_tokenOut].balance += amountOut; } /** - * @notice Get the balance of a specific token for a user. - * @param _user User address to get the balance of. + * @notice Get the struct details for a token.. * @param _token Token address to get the balance of. * @return balance Balance of the user for the token. */ - function getERC20Balance( - address _user, + function getStruct( address _token - ) external view returns (uint256) { - return userAddressToBalances[_user][_token]; + ) external view returns (UserBalance memory) { + return tokenAddressToStruct[_token]; } } diff --git a/src/VaultFactory.sol b/src/VaultFactory.sol new file mode 100644 index 0000000..a1c4c9c --- /dev/null +++ b/src/VaultFactory.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; +import "./Vault.sol"; +import "../script/HelperConfig.s.sol"; + +contract VaultFactory is HelperConfig { + mapping(address => address) public ownerToVaultAddress; + event VaultCreated(address indexed owner, address indexed vault); + HelperConfig.NetworkConfig public activeNetworkConfig; + + constructor() { + activeNetworkConfig = getBaseSepoliaConfig(); + } + + function createVault(address owner) external returns (address vault) { + Vault vaultInstance = new Vault( + owner, + activeNetworkConfig.agent, + activeNetworkConfig.aavePool, + activeNetworkConfig.compoundUsdc, + activeNetworkConfig.uniswapRouter, + activeNetworkConfig.uniswapFactory + ); + ownerToVaultAddress[owner] = address(vaultInstance); + emit VaultCreated(owner, address(vaultInstance)); + return address(vaultInstance); + } + + function getVaultAddress() external view returns (address) { + return ownerToVaultAddress[msg.sender]; + } +} diff --git a/test/forked-uint/LiquidityManagerTest.sol b/test/forked-uint/LiquidityManagerTest.t.sol similarity index 73% rename from test/forked-uint/LiquidityManagerTest.sol rename to test/forked-uint/LiquidityManagerTest.t.sol index e21d713..f7692f0 100644 --- a/test/forked-uint/LiquidityManagerTest.sol +++ b/test/forked-uint/LiquidityManagerTest.t.sol @@ -3,16 +3,16 @@ pragma solidity 0.8.22; import {Test, console} from "forge-std/Test.sol"; import {StdUtils} from "forge-std/StdUtils.sol"; -import {LiquidityManager} from "../../src/LiquidityManager.sol"; -import {CometMainInterface} from "../../src/interfaces/IComet.sol"; -import {CometExtInterface} from "../../src/interfaces/ICometExt.sol"; +import {VaultFactory} from "../../src/VaultFactory.sol"; +import {Vault} from "../../src/Vault.sol"; import {HelperConfig} from "../../script/HelperConfig.s.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IUniswapV3Pool} from "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol"; import {IUniswapV3Factory} from "@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol"; contract LiquidityManagerTest is Test { - LiquidityManager public supplyLiquidity; + VaultFactory public vaultFactory; + Vault public vault; HelperConfig public helperConfig; HelperConfig.NetworkConfig public networkConfig; address owner = address(1); @@ -36,15 +36,13 @@ contract LiquidityManagerTest is Test { networkConfig = helperConfig.getBaseSepoliaConfig(); fork = vm.createSelectFork(BASE_SEPOLIA_RPC_URL_2); vm.startPrank(owner); - supplyLiquidity = new LiquidityManager( - address(networkConfig.aavePool), - address(networkConfig.compoundUsdc), - address(networkConfig.uniswapRouter), - address(networkConfig.uniswapFactory), - address(networkConfig.vault) - ); - vm.stopPrank(); + vaultFactory = new VaultFactory(); + address _vault = vaultFactory.createVault(); + vault = Vault(_vault); deal(networkConfig.usdc, owner, 100 * 1e6); + IERC20(networkConfig.usdc).approve(address(vault), 100 * 1e6); + vault.depositERC20(networkConfig.usdc, 100 * 1e6); + vm.stopPrank(); // // Fund the vault with USDC and WETH for testing // deal(networkConfig.usdc, networkConfig.vault, 100_000 * 1e6); // 100k USDC @@ -197,49 +195,72 @@ contract LiquidityManagerTest is Test { // } function testSupplyUSDCOnAave() public { - vm.startPrank(owner); - IERC20(networkConfig.usdc).approve(address(supplyLiquidity), 69); - supplyLiquidity.supplyLiquidityOnAave(networkConfig.usdc, 69); - (uint256 totalCollateralBase, , , , , ) = supplyLiquidity - .getAaveLiquidityStatus(owner); + vm.startPrank(networkConfig.agent); + vault.lendTokens("aave", networkConfig.usdc, 10 * 1e6); + (uint256 totalCollateralBase, , , , , ) = vault + .getAaveLiquidityStatus(); + Vault.UserBalance memory userBalance = vault.getStruct( + networkConfig.usdc + ); + assertEq(userBalance.investedInAave, 10 * 1e6); + assertEq(userBalance.balance, 90 * 1e6); assertGt(totalCollateralBase, 0); - assertEq(IERC20(networkConfig.aaveUsdc).balanceOf(address(owner)), 69); + assertEq( + IERC20(networkConfig.aaveUsdc).balanceOf(address(vault)), + 10 * 1e6 + ); vm.stopPrank(); } function testWithdrawUSDCFromAave() public { - vm.startPrank(owner); - IERC20(networkConfig.usdc).approve(address(supplyLiquidity), 69); - supplyLiquidity.supplyLiquidityOnAave(networkConfig.usdc, 69); - IERC20(networkConfig.aaveUsdc).approve(address(supplyLiquidity), 69); - supplyLiquidity.withdrawLiquidityFromAave( + vm.startPrank(networkConfig.agent); + vault.lendTokens("aave", networkConfig.usdc, 10 * 1e6); + uint256 amountWithdrawn = vault.withdrawLentTokens( + "aave", networkConfig.usdc, - networkConfig.aaveUsdc, - 69 + 5 * 1e6 + ); + assertEq(amountWithdrawn, 5 * 1e6); + (uint256 totalCollateralBase, , , , , ) = vault + .getAaveLiquidityStatus(); + assertGt(totalCollateralBase, 0); + Vault.UserBalance memory userBalance = vault.getStruct( + networkConfig.usdc + ); + assertEq(userBalance.balance, 95 * 1e6); + assertEq( + IERC20(networkConfig.usdc).balanceOf(address(vault)), + 95 * 1e6 ); - (uint256 totalCollateralBase, , , , , ) = supplyLiquidity - .getAaveLiquidityStatus(owner); - assertEq(totalCollateralBase, 0); vm.stopPrank(); } function testSupplyUSDCOnCompound() public { - vm.startPrank(owner); - IERC20(networkConfig.usdc).approve(address(supplyLiquidity), 69000000); - supplyLiquidity.supplyLiquidityOnCompound(networkConfig.usdc, 69000000); - assertGt(supplyLiquidity.getCompoundLiquidityStatus(owner), 0); + vm.startPrank(networkConfig.agent); + vault.lendTokens("compound", networkConfig.usdc, 10 * 1e6); + assertGt(vault.getCompoundLiquidityStatus(), 0); + Vault.UserBalance memory userBalance = vault.getStruct( + networkConfig.usdc + ); + assertEq(userBalance.investedInCompound, 10 * 1e6); + assertEq(userBalance.balance, 90 * 1e6); vm.stopPrank(); } function testWithdrawUSDCFromCompound() public { - vm.startPrank(owner); - IERC20(networkConfig.usdc).approve(address(supplyLiquidity), 69000000); - supplyLiquidity.supplyLiquidityOnCompound(networkConfig.usdc, 69000000); - CometExtInterface(networkConfig.compoundUsdc).allow( - address(supplyLiquidity), - true + vm.startPrank(networkConfig.agent); + vault.lendTokens("compound", networkConfig.usdc, 10 * 1e6); + uint256 amountWithdrawn = vault.withdrawLentTokens( + "compound", + networkConfig.usdc, + 5 * 1e6 ); - supplyLiquidity.withdrawLiquidityFromCompound(networkConfig.usdc, 100); - assertLt(supplyLiquidity.getCompoundLiquidityStatus(owner), 69000000); + assertEq(amountWithdrawn, 5 * 1e6); + Vault.UserBalance memory userBalance = vault.getStruct( + networkConfig.usdc + ); + assertEq(userBalance.balance, 95 * 1e6); + assertEq(userBalance.investedInCompound, 5 * 1e6); + vm.stopPrank(); } } diff --git a/test/forked-uint/VaultTest.t.sol b/test/forked-uint/VaultTest.t.sol new file mode 100644 index 0000000..57b6372 --- /dev/null +++ b/test/forked-uint/VaultTest.t.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.22; + +import {Test, console} from "forge-std/Test.sol"; +import {StdUtils} from "forge-std/StdUtils.sol"; +import {Vault} from "../../src/Vault.sol"; +import {VaultFactory} from "../../src/VaultFactory.sol"; +import {HelperConfig} from "../../script/HelperConfig.s.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +contract VaultTest is Test { + HelperConfig public helperConfig; + HelperConfig.NetworkConfig public networkConfig; + address owner = address(1); + address user = address(2); + VaultFactory public vaultFactory; + uint256 fork; + string BASE_SEPOLIA_RPC_URL_2 = vm.envString("BASE_SEPOLIA_RPC_URL_2"); + + function setUp() public { + helperConfig = new HelperConfig(); + networkConfig = helperConfig.getBaseSepoliaConfig(); + fork = vm.createSelectFork(BASE_SEPOLIA_RPC_URL_2); + vm.startPrank(owner); + vaultFactory = new VaultFactory(); + vm.stopPrank(); + deal(networkConfig.usdc, user, 100 * 1e6); + } + + function testCreateVault() public { + vm.startPrank(user); + address _vault = vaultFactory.createVault(); + Vault vault = Vault(_vault); + assertEq(vault.owner(), user); + vm.stopPrank(); + } + + function testDepositERC20() public { + vm.startPrank(user); + address _vault = vaultFactory.createVault(); + Vault vault = Vault(_vault); + IERC20(networkConfig.usdc).approve(address(vault), 100 * 1e6); + vault.depositERC20(networkConfig.usdc, 100 * 1e6); + assertEq(IERC20(networkConfig.usdc).balanceOf(user), 0); + assertEq( + IERC20(networkConfig.usdc).balanceOf(address(vault)), + 100 * 1e6 + ); + Vault.UserBalance memory userBalance = vault.getStruct( + networkConfig.usdc + ); + assertEq(userBalance.balance, 100 * 1e6); + vm.stopPrank(); + } + + function testWithdrawERC20() public { + vm.startPrank(user); + address _vault = vaultFactory.createVault(); + Vault vault = Vault(_vault); + IERC20(networkConfig.usdc).approve(address(vault), 100 * 1e6); + vault.depositERC20(networkConfig.usdc, 100 * 1e6); + vault.withdrawERC20(networkConfig.usdc, 100 * 1e6); + assertEq(IERC20(networkConfig.usdc).balanceOf(user), 100 * 1e6); + assertEq(IERC20(networkConfig.usdc).balanceOf(address(vault)), 0); + vm.stopPrank(); + } +}