git.delta.rocks / unique-network / refs/commits / 817fef63882f

difftreelog

chore remove duplicated check in fractionalizer contract

Grigoriy Simonov2022-08-11parent: #281718a.patch.diff
in: master

3 files changed

modifiedtests/src/eth/fractionalizer/Fractionalizer.bindiffbeforeafterboth
--- a/tests/src/eth/fractionalizer/Fractionalizer.bin
+++ b/tests/src/eth/fractionalizer/Fractionalizer.bin
@@ -1 +1 @@
-60c0604052600a60805269526546756e6769626c6560b01b60a0527fcdb72fd4e1d0d6d4eebd7ab142113ec2b4b06ddb24324db5c287ef01ab484d6b60055534801561004a57600080fd5b50600480546001600160a01b031916331790556114138061006c6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063115091401461005c5780631b191ea214610071578063d470e60f14610084578063dbc38ad214610097578063eb292412146100aa575b600080fd5b61006f61006a366004610fd7565b6100bd565b005b61006f61007f366004611044565b61035b565b61006f6100923660046110de565b6104c0565b61006f6100a536600461110a565b61089d565b61006f6100b8366004611166565b610f32565b6004546001600160a01b031633146100f05760405162461bcd60e51b81526004016100e79061119f565b60405180910390fd5b6000546001600160a01b0316156101495760405162461bcd60e51b815260206004820152601d60248201527f52465420636f6c6c656374696f6e20697320616c72656164792073657400000060448201526064016100e7565b60008190506000816001600160a01b031663d34b55b86040518163ffffffff1660e01b81526004016000604051808303816000875af1158015610190573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526101b891908101906111dd565b905060055481805190602001201461022f5760405162461bcd60e51b815260206004820152603460248201527f57726f6e6720636f6c6c656374696f6e20747970652e20436f6c6c656374696f604482015273371034b9903737ba103932b33ab733b4b136329760611b60648201526084016100e7565b816001600160a01b03166304a460536040518163ffffffff1660e01b81526004016020604051808303816000875af115801561026f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029391906112ad565b6103055760405162461bcd60e51b815260206004820152603c60248201527f4672616374696f6e616c697a657220636f6e74726163742073686f756c64206260448201527f6520616e2061646d696e206f662074686520636f6c6c656374696f6e0000000060648201526084016100e7565b600080546001600160a01b0319166001600160a01b0385169081179091556040519081527f7186a599bf2297b1f4c8957d30b0965291eee0021a5f9a0aeb54dcbd1ffdceef9060200160405180910390a1505050565b6004546001600160a01b031633146103855760405162461bcd60e51b81526004016100e79061119f565b6000546001600160a01b0316156103de5760405162461bcd60e51b815260206004820152601d60248201527f52465420636f6c6c656374696f6e20697320616c72656164792073657400000060448201526064016100e7565b6040516344a68ad560e01b8152736c4e9fe1ae37a41e93cee429e8e1881abdcbb54f9081906344a68ad590610421908a908a908a908a908a908a906004016112f3565b6020604051808303816000875af1158015610440573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610464919061133c565b600080546001600160a01b0319166001600160a01b039290921691821790556040519081527f7186a599bf2297b1f4c8957d30b0965291eee0021a5f9a0aeb54dcbd1ffdceef906020015b60405180910390a150505050505050565b6000546001600160a01b03166105145760405162461bcd60e51b81526020600482015260196024820152781491950818dbdb1b1958dd1a5bdb881a5cc81b9bdd081cd95d603a1b60448201526064016100e7565b6000546001600160a01b038381169116146105685760405162461bcd60e51b81526020600482015260146024820152732bb937b7339029232a1031b7b63632b1ba34b7b760611b60448201526064016100e7565b600080546040516355bb7d6360e11b8152600481018490526001600160a01b039091169190829063ab76fac690602401602060405180830381865afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d9919061133c565b6001600160a01b03808216600090815260036020908152604091829020825180840190935280549093168083526001909301549082015291925061065f5760405162461bcd60e51b815260206004820181905260248201527f4e6f20636f72726573706f6e64696e67204e465420746f6b656e20666f756e6460448201526064016100e7565b6000829050806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c69190611359565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561070a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072e9190611359565b1461078a5760405162461bcd60e51b815260206004820152602660248201527f4e6f7420616c6c2070696563657320617265206f776e6564206279207468652060448201526531b0b63632b960d11b60648201526084016100e7565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd906107ba90339030908a90600401611372565b600060405180830381600087803b1580156107d457600080fd5b505af11580156107e8573d6000803e3d6000fd5b5050835160208501516040516323b872dd60e01b81526001600160a01b0390921693506323b872dd92506108229130913391600401611372565b600060405180830381600087803b15801561083c57600080fd5b505af1158015610850573d6000803e3d6000fd5b5050835160208501516040517fe9e9808d24ff79ccc3b1ecf48be7b2d11591adccc452150d0d7947cb48eb0d53945061088d935087929190611372565b60405180910390a1505050505050565b6000546001600160a01b03166108f15760405162461bcd60e51b81526020600482015260196024820152781491950818dbdb1b1958dd1a5bdb881a5cc81b9bdd081cd95d603a1b60448201526064016100e7565b6000546040516331a9108f60e11b8152600481018490526001600160a01b0391821691339190861690636352211e90602401602060405180830381865afa158015610940573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610964919061133c565b6001600160a01b03161461098a5760405162461bcd60e51b81526004016100e790611396565b6001600160a01b03841660009081526001602081905260409091205460ff16151514610a1e5760405162461bcd60e51b815260206004820152603c60248201527f4672616374696f6e616c697a6174696f6e206f66207468697320636f6c6c656360448201527f74696f6e206973206e6f7420616c6c6f7765642062792061646d696e0000000060648201526084016100e7565b6040516331a9108f60e11b81526004810184905233906001600160a01b03861690636352211e90602401602060405180830381865afa158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a89919061133c565b6001600160a01b031614610aaf5760405162461bcd60e51b81526004016100e790611396565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd90610adf90339030908890600401611372565b600060405180830381600087803b158015610af957600080fd5b505af1158015610b0d573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600260209081526040808320868452909152812054819081908103610d5957836001600160a01b03166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba19190611359565b6040516340c10f1960e01b8152306004820152602481018290529093506001600160a01b038516906340c10f19906044016020604051808303816000875af1158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1591906112ad565b506040516355bb7d6360e11b8152600481018490526001600160a01b0385169063ab76fac690602401602060405180830381865afa158015610c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f919061133c565b6001600160a01b0388811660008181526002602090815260408083208c84528252808320899055805180820182528481528083018d8152878716808652600390945293829020905181546001600160a01b0319169616959095178555915160019094019390935551630217888360e11b81526004810191909152602481018990529193508392509063042f1106906044016020604051808303816000875af1158015610d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5391906112ad565b50610dea565b6001600160a01b0387811660009081526002602090815260408083208a8452909152908190205490516355bb7d6360e11b8152600481018290529094509085169063ab76fac690602401602060405180830381865afa158015610dc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de4919061133c565b91508190505b60405163d2418ca760e01b81526001600160801b03861660048201526001600160a01b0382169063d2418ca7906024016020604051808303816000875af1158015610e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5d91906112ad565b5060405163a9059cbb60e01b81523360048201526001600160801b03861660248201526001600160a01b0382169063a9059cbb906044016020604051808303816000875af1158015610eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed791906112ad565b50604080516001600160a01b03808a168252602082018990528416918101919091526001600160801b03861660608201527f29f372538523984f33874da1b50e596ce0f180a6eb04d7ff22bb2ce80e1576b6906080016104af565b6004546001600160a01b03163314610f5c5760405162461bcd60e51b81526004016100e79061119f565b6001600160a01b038216600081815260016020908152604091829020805460ff19168515159081179091558251938452908301527f6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a11588910160405180910390a15050565b6001600160a01b0381168114610fd457600080fd5b50565b600060208284031215610fe957600080fd5b8135610ff481610fbf565b9392505050565b60008083601f84011261100d57600080fd5b50813567ffffffffffffffff81111561102557600080fd5b60208301915083602082850101111561103d57600080fd5b9250929050565b6000806000806000806060878903121561105d57600080fd5b863567ffffffffffffffff8082111561107557600080fd5b6110818a838b01610ffb565b9098509650602089013591508082111561109a57600080fd5b6110a68a838b01610ffb565b909650945060408901359150808211156110bf57600080fd5b506110cc89828a01610ffb565b979a9699509497509295939492505050565b600080604083850312156110f157600080fd5b82356110fc81610fbf565b946020939093013593505050565b60008060006060848603121561111f57600080fd5b833561112a81610fbf565b92506020840135915060408401356001600160801b038116811461114d57600080fd5b809150509250925092565b8015158114610fd457600080fd5b6000806040838503121561117957600080fd5b823561118481610fbf565b9150602083013561119481611158565b809150509250929050565b6020808252600e908201526d27b7363c9037bbb732b91031b0b760911b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156111f057600080fd5b825167ffffffffffffffff8082111561120857600080fd5b818501915085601f83011261121c57600080fd5b81518181111561122e5761122e6111c7565b604051601f8201601f19908116603f01168101908382118183101715611256576112566111c7565b81604052828152888684870101111561126e57600080fd5b600093505b828410156112905784840186015181850187015292850192611273565b828411156112a15760008684830101525b98975050505050505050565b6000602082840312156112bf57600080fd5b8151610ff481611158565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600061130760608301888a6112ca565b828103602084015261131a8187896112ca565b9050828103604084015261132f8185876112ca565b9998505050505050505050565b60006020828403121561134e57600080fd5b8151610ff481610fbf565b60006020828403121561136b57600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60208082526027908201527f4f6e6c7920746f6b656e206f776e657220636f756c64206672616374696f6e616040820152661b1a5e99481a5d60ca1b60608201526080019056fea2646970667358221220f0c80476760f4be8497504758c3f192eb67e71e7fec57d1c010829bb7ea7807464736f6c634300080f0033
\ No newline at end of file
+60c0604052600a60805269526546756e6769626c6560b01b60a0527fcdb72fd4e1d0d6d4eebd7ab142113ec2b4b06ddb24324db5c287ef01ab484d6b60055534801561004a57600080fd5b50600480546001600160a01b0319163317905561137a8061006c6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063115091401461005c5780631b191ea214610071578063d470e60f14610084578063dbc38ad214610097578063eb292412146100aa575b600080fd5b61006f61006a366004610f85565b6100bd565b005b61006f61007f366004610ff2565b61035b565b61006f61009236600461108c565b6104c0565b61006f6100a53660046110b8565b61089d565b61006f6100b8366004611114565b610ee0565b6004546001600160a01b031633146100f05760405162461bcd60e51b81526004016100e79061114d565b60405180910390fd5b6000546001600160a01b0316156101495760405162461bcd60e51b815260206004820152601d60248201527f52465420636f6c6c656374696f6e20697320616c72656164792073657400000060448201526064016100e7565b60008190506000816001600160a01b031663d34b55b86040518163ffffffff1660e01b81526004016000604051808303816000875af1158015610190573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526101b8919081019061118b565b905060055481805190602001201461022f5760405162461bcd60e51b815260206004820152603460248201527f57726f6e6720636f6c6c656374696f6e20747970652e20436f6c6c656374696f604482015273371034b9903737ba103932b33ab733b4b136329760611b60648201526084016100e7565b816001600160a01b03166304a460536040518163ffffffff1660e01b81526004016020604051808303816000875af115801561026f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610293919061125b565b6103055760405162461bcd60e51b815260206004820152603c60248201527f4672616374696f6e616c697a657220636f6e74726163742073686f756c64206260448201527f6520616e2061646d696e206f662074686520636f6c6c656374696f6e0000000060648201526084016100e7565b600080546001600160a01b0319166001600160a01b0385169081179091556040519081527f7186a599bf2297b1f4c8957d30b0965291eee0021a5f9a0aeb54dcbd1ffdceef9060200160405180910390a1505050565b6004546001600160a01b031633146103855760405162461bcd60e51b81526004016100e79061114d565b6000546001600160a01b0316156103de5760405162461bcd60e51b815260206004820152601d60248201527f52465420636f6c6c656374696f6e20697320616c72656164792073657400000060448201526064016100e7565b6040516344a68ad560e01b8152736c4e9fe1ae37a41e93cee429e8e1881abdcbb54f9081906344a68ad590610421908a908a908a908a908a908a906004016112a1565b6020604051808303816000875af1158015610440573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046491906112ea565b600080546001600160a01b0319166001600160a01b039290921691821790556040519081527f7186a599bf2297b1f4c8957d30b0965291eee0021a5f9a0aeb54dcbd1ffdceef906020015b60405180910390a150505050505050565b6000546001600160a01b03166105145760405162461bcd60e51b81526020600482015260196024820152781491950818dbdb1b1958dd1a5bdb881a5cc81b9bdd081cd95d603a1b60448201526064016100e7565b6000546001600160a01b038381169116146105685760405162461bcd60e51b81526020600482015260146024820152732bb937b7339029232a1031b7b63632b1ba34b7b760611b60448201526064016100e7565b600080546040516355bb7d6360e11b8152600481018490526001600160a01b039091169190829063ab76fac690602401602060405180830381865afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d991906112ea565b6001600160a01b03808216600090815260036020908152604091829020825180840190935280549093168083526001909301549082015291925061065f5760405162461bcd60e51b815260206004820181905260248201527f4e6f20636f72726573706f6e64696e67204e465420746f6b656e20666f756e6460448201526064016100e7565b6000829050806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c69190611307565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561070a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072e9190611307565b1461078a5760405162461bcd60e51b815260206004820152602660248201527f4e6f7420616c6c2070696563657320617265206f776e6564206279207468652060448201526531b0b63632b960d11b60648201526084016100e7565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd906107ba90339030908a90600401611320565b600060405180830381600087803b1580156107d457600080fd5b505af11580156107e8573d6000803e3d6000fd5b5050835160208501516040516323b872dd60e01b81526001600160a01b0390921693506323b872dd92506108229130913391600401611320565b600060405180830381600087803b15801561083c57600080fd5b505af1158015610850573d6000803e3d6000fd5b5050835160208501516040517fe9e9808d24ff79ccc3b1ecf48be7b2d11591adccc452150d0d7947cb48eb0d53945061088d935087929190611320565b60405180910390a1505050505050565b6000546001600160a01b03166108f15760405162461bcd60e51b81526020600482015260196024820152781491950818dbdb1b1958dd1a5bdb881a5cc81b9bdd081cd95d603a1b60448201526064016100e7565b600080546001600160a01b0385811683526001602081905260409093205491169160ff90911615151461098c5760405162461bcd60e51b815260206004820152603c60248201527f4672616374696f6e616c697a6174696f6e206f66207468697320636f6c6c656360448201527f74696f6e206973206e6f7420616c6c6f7765642062792061646d696e0000000060648201526084016100e7565b6040516331a9108f60e11b81526004810184905233906001600160a01b03861690636352211e90602401602060405180830381865afa1580156109d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f791906112ea565b6001600160a01b031614610a5d5760405162461bcd60e51b815260206004820152602760248201527f4f6e6c7920746f6b656e206f776e657220636f756c64206672616374696f6e616044820152661b1a5e99481a5d60ca1b60648201526084016100e7565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd90610a8d90339030908890600401611320565b600060405180830381600087803b158015610aa757600080fd5b505af1158015610abb573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600260209081526040808320868452909152812054819081908103610d0757836001600160a01b03166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4f9190611307565b6040516340c10f1960e01b8152306004820152602481018290529093506001600160a01b038516906340c10f19906044016020604051808303816000875af1158015610b9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc3919061125b565b506040516355bb7d6360e11b8152600481018490526001600160a01b0385169063ab76fac690602401602060405180830381865afa158015610c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2d91906112ea565b6001600160a01b0388811660008181526002602090815260408083208c84528252808320899055805180820182528481528083018d8152878716808652600390945293829020905181546001600160a01b0319169616959095178555915160019094019390935551630217888360e11b81526004810191909152602481018990529193508392509063042f1106906044016020604051808303816000875af1158015610cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d01919061125b565b50610d98565b6001600160a01b0387811660009081526002602090815260408083208a8452909152908190205490516355bb7d6360e11b8152600481018290529094509085169063ab76fac690602401602060405180830381865afa158015610d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9291906112ea565b91508190505b60405163d2418ca760e01b81526001600160801b03861660048201526001600160a01b0382169063d2418ca7906024016020604051808303816000875af1158015610de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0b919061125b565b5060405163a9059cbb60e01b81523360048201526001600160801b03861660248201526001600160a01b0382169063a9059cbb906044016020604051808303816000875af1158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e85919061125b565b50604080516001600160a01b03808a168252602082018990528416918101919091526001600160801b03861660608201527f29f372538523984f33874da1b50e596ce0f180a6eb04d7ff22bb2ce80e1576b6906080016104af565b6004546001600160a01b03163314610f0a5760405162461bcd60e51b81526004016100e79061114d565b6001600160a01b038216600081815260016020908152604091829020805460ff19168515159081179091558251938452908301527f6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a11588910160405180910390a15050565b6001600160a01b0381168114610f8257600080fd5b50565b600060208284031215610f9757600080fd5b8135610fa281610f6d565b9392505050565b60008083601f840112610fbb57600080fd5b50813567ffffffffffffffff811115610fd357600080fd5b602083019150836020828501011115610feb57600080fd5b9250929050565b6000806000806000806060878903121561100b57600080fd5b863567ffffffffffffffff8082111561102357600080fd5b61102f8a838b01610fa9565b9098509650602089013591508082111561104857600080fd5b6110548a838b01610fa9565b9096509450604089013591508082111561106d57600080fd5b5061107a89828a01610fa9565b979a9699509497509295939492505050565b6000806040838503121561109f57600080fd5b82356110aa81610f6d565b946020939093013593505050565b6000806000606084860312156110cd57600080fd5b83356110d881610f6d565b92506020840135915060408401356001600160801b03811681146110fb57600080fd5b809150509250925092565b8015158114610f8257600080fd5b6000806040838503121561112757600080fd5b823561113281610f6d565b9150602083013561114281611106565b809150509250929050565b6020808252600e908201526d27b7363c9037bbb732b91031b0b760911b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561119e57600080fd5b825167ffffffffffffffff808211156111b657600080fd5b818501915085601f8301126111ca57600080fd5b8151818111156111dc576111dc611175565b604051601f8201601f19908116603f0116810190838211818310171561120457611204611175565b81604052828152888684870101111561121c57600080fd5b600093505b8284101561123e5784840186015181850187015292850192611221565b8284111561124f5760008684830101525b98975050505050505050565b60006020828403121561126d57600080fd5b8151610fa281611106565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006112b560608301888a611278565b82810360208401526112c8818789611278565b905082810360408401526112dd818587611278565b9998505050505050505050565b6000602082840312156112fc57600080fd5b8151610fa281610f6d565b60006020828403121561131957600080fd5b5051919050565b6001600160a01b03938416815291909216602082015260408101919091526060019056fea2646970667358221220a118fe8c3b83b3933baa7bfe084ed165a014ec509367252e5c99e1a3332d000364736f6c634300080f0033
\ No newline at end of file
modifiedtests/src/eth/fractionalizer/Fractionalizer.soldiffbeforeafterboth
--- a/tests/src/eth/fractionalizer/Fractionalizer.sol
+++ b/tests/src/eth/fractionalizer/Fractionalizer.sol
@@ -74,10 +74,6 @@
         );
         UniqueRefungible rftCollectionContract = UniqueRefungible(rftCollection);
         require(
-            UniqueNFT(_collection).ownerOf(_token) == msg.sender,
-            "Only token owner could fractionalize it"
-        );
-        require(
             nftCollectionAllowList[_collection] == true,
             "Fractionalization of this collection is not allowed by admin"
         );
modifiedtests/src/eth/fractionalizer/fractionalizer.test.tsdiffbeforeafterboth
before · tests/src/eth/fractionalizer/fractionalizer.test.ts
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.161718import Web3 from 'web3';19import {ApiPromise} from '@polkadot/api';20import {evmToAddress} from '@polkadot/util-crypto';21import {readFile} from 'fs/promises';22import fractionalizerAbi from './FractionalizerAbi.json';23import {submitTransactionAsync} from '../../substrate/substrate-api';24import {UNIQUE} from '../../util/helpers';25import {collectionIdToAddress, createEthAccountWithBalance, createNonfungibleCollection, createRefungibleCollection, GAS_ARGS, itWeb3, tokenIdFromAddress, uniqueNFT, uniqueRefungible, uniqueRefungibleToken} from '../util/helpers';26import {Contract} from 'web3-eth-contract';2728import chai from 'chai';29import chaiAsPromised from 'chai-as-promised';30import chaiLike from 'chai-like';31import {IKeyringPair} from '@polkadot/types/types';32chai.use(chaiAsPromised);33chai.use(chaiLike);34const expect = chai.expect;3536async function deployFractionalizer(api: ApiPromise, web3: Web3, owner: string) {37  const fractionalizerContract = new web3.eth.Contract(fractionalizerAbi as any, undefined, {38    from: owner,39    ...GAS_ARGS,40  });41  return await fractionalizerContract.deploy({data: (await readFile(`${__dirname}/Fractionalizer.bin`)).toString()}).send({from: owner});42}4344async function initFractionalizer(api: ApiPromise, web3: Web3, privateKeyWrapper: (account: string) => IKeyringPair, owner: string) {45  const fractionalizer = await deployFractionalizer(api, web3, owner);46  const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);47  const alice = privateKeyWrapper('//Alice');48  await submitTransactionAsync(alice, tx);49  const result = await fractionalizer.methods.createAndSetRFTCollection('A', 'B', 'C').send();50  const rftCollectionAddress = result.events.RFTCollectionSet.returnValues._collection;51  return {fractionalizer, rftCollectionAddress};52}5354async function createRFTToken(api: ApiPromise, web3: Web3, owner: string, fractionalizer: Contract, amount: bigint) {55  const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);56  const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);57  const nftTokenId = await nftContract.methods.nextTokenId().call();58  await nftContract.methods.mint(owner, nftTokenId).send();5960  await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, true).send();61  await nftContract.methods.approve(fractionalizer.options.address, nftTokenId).send();62  const result = await fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, amount).send();63  const {_collection, _tokenId, _rftToken} = result.events.Fractionalized.returnValues;64  return {65    nftCollectionAddress: _collection,66    nftTokenId: _tokenId,67    rftTokenAddress: _rftToken,68  };69}7071describe('Fractionalizer contract usage', () => {72  itWeb3('Set RFT collection', async ({api, web3, privateKeyWrapper}) => {73    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);74    const fractionalizer = await deployFractionalizer(api, web3, owner);75    const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);76    const refungibleContract = uniqueRefungible(web3, collectionIdAddress, owner);77    await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();78    const result = await fractionalizer.methods.setRFTCollection(collectionIdAddress).send();79    expect(result.events).to.be.like({80      RFTCollectionSet: {81        returnValues: {82          _collection: collectionIdAddress,83        },84      },85    });86  });8788  itWeb3('Mint RFT collection', async ({api, web3, privateKeyWrapper}) => {89    const alice = privateKeyWrapper('//Alice');90    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);91    const fractionalizer = await deployFractionalizer(api, web3, owner);92    const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);93    await submitTransactionAsync(alice, tx);9495    const result = await fractionalizer.methods.createAndSetRFTCollection('A', 'B', 'C').send({from: owner});96    expect(result.events).to.be.like({97      RFTCollectionSet: {},98    });99    expect(result.events.RFTCollectionSet.returnValues._collection).to.be.ok;100  });101102  itWeb3('Set Allowlist', async ({api, web3, privateKeyWrapper}) => {103    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);104    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);    105106    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);107    const result1 = await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, true).send({from: owner});108    expect(result1.events).to.be.like({109      AllowListSet: {110        returnValues: {111          _collection: nftCollectionAddress,112          _status: true,113        },114      },115    });116    const result2 = await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, false).send({from: owner});117    expect(result2.events).to.be.like({118      AllowListSet: {119        returnValues: {120          _collection: nftCollectionAddress,121          _status: false,122        },123      },124    });125  });126127  itWeb3('NFT to RFT', async ({api, web3, privateKeyWrapper}) => {128    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);129130    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);131    const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);132    const nftTokenId = await nftContract.methods.nextTokenId().call();133    await nftContract.methods.mint(owner, nftTokenId).send();134135    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);136137    await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, true).send();138    await nftContract.methods.approve(fractionalizer.options.address, nftTokenId).send();139    const result = await fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).send();140    expect(result.events).to.be.like({141      Fractionalized: {142        returnValues: {143          _collection: nftCollectionAddress,144          _tokenId: nftTokenId,145          _amount: '100',146        },147      },148    });149    const rftTokenAddress = result.events.Fractionalized.returnValues._rftToken;150    const rftTokenContract = uniqueRefungibleToken(web3, rftTokenAddress, owner);151    expect(await rftTokenContract.methods.balanceOf(owner).call()).to.equal('100');152  });153154  itWeb3('RFT to NFT', async ({api, web3, privateKeyWrapper}) => {155    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);156157    const {fractionalizer, rftCollectionAddress} = await initFractionalizer(api, web3, privateKeyWrapper, owner);158    const {rftTokenAddress, nftCollectionAddress, nftTokenId} = await createRFTToken(api, web3, owner, fractionalizer, 100n);159160    const {collectionId, tokenId} = tokenIdFromAddress(rftTokenAddress);161    const refungibleAddress = collectionIdToAddress(collectionId);162    expect(rftCollectionAddress).to.be.equal(refungibleAddress);163    const refungibleTokenContract = uniqueRefungibleToken(web3, rftTokenAddress, owner);164    await refungibleTokenContract.methods.approve(fractionalizer.options.address, 100).send();165    const result = await fractionalizer.methods.rft2nft(refungibleAddress, tokenId).send();166    expect(result.events).to.be.like({167      Defractionalized: {168        returnValues: {169          _rftToken: rftTokenAddress,170          _nftCollection: nftCollectionAddress,171          _nftTokenId: nftTokenId,172        },173      },174    });175  });176});177178179180describe('Negative Integration Tests for fractionalizer', () => {181  itWeb3('call setRFTCollection twice', async ({api, web3, privateKeyWrapper}) => {182    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);183    const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);184    const refungibleContract = uniqueRefungible(web3, collectionIdAddress, owner);185186    const fractionalizer = await deployFractionalizer(api, web3, owner);187    await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();188    await fractionalizer.methods.setRFTCollection(collectionIdAddress).send();189190    await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())191      .to.eventually.be.rejectedWith(/RFT collection is already set$/g);192  });193194  itWeb3('call setRFTCollection with NFT collection', async ({api, web3, privateKeyWrapper}) => {195    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);196    const {collectionIdAddress} = await createNonfungibleCollection(api, web3, owner);197    const nftContract = uniqueNFT(web3, collectionIdAddress, owner);198199    const fractionalizer = await deployFractionalizer(api, web3, owner);200    await nftContract.methods.addCollectionAdmin(fractionalizer.options.address).send();201202    await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())203      .to.eventually.be.rejectedWith(/Wrong collection type. Collection is not refungible.$/g);204  });205206  itWeb3('call setRFTCollection while not collection admin', async ({api, web3, privateKeyWrapper}) => {207    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);208    const fractionalizer = await deployFractionalizer(api, web3, owner);209    const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);210211    await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())212      .to.eventually.be.rejectedWith(/Fractionalizer contract should be an admin of the collection$/g);213  });214215  itWeb3('call setRFTCollection after createAndSetRFTCollection', async ({api, web3, privateKeyWrapper}) => {216    const alice = privateKeyWrapper('//Alice');217    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);218    const fractionalizer = await deployFractionalizer(api, web3, owner);219    const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);220    await submitTransactionAsync(alice, tx);221222    const result = await fractionalizer.methods.createAndSetRFTCollection('A', 'B', 'C').send({from: owner});223    const collectionIdAddress = result.events.RFTCollectionSet.returnValues._collection;224225    await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())226      .to.eventually.be.rejectedWith(/RFT collection is already set$/g);227  });228229  itWeb3('call nft2rft without setting RFT collection for contract', async ({api, web3, privateKeyWrapper}) => {230    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);231232    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);233    const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);234    const nftTokenId = await nftContract.methods.nextTokenId().call();235    await nftContract.methods.mint(owner, nftTokenId).send();236237    const fractionalizer = await deployFractionalizer(api, web3, owner);238239    await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).call())240      .to.eventually.be.rejectedWith(/RFT collection is not set$/g);241  });242243  itWeb3('call nft2rft while not owner of NFT token', async ({api, web3, privateKeyWrapper}) => {244    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);245    const nftOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);246247    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);248    const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);249    const nftTokenId = await nftContract.methods.nextTokenId().call();250    await nftContract.methods.mint(owner, nftTokenId).send();251    await nftContract.methods.transfer(nftOwner, 1).send();252253254    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);255256    await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).call())257      .to.eventually.be.rejectedWith(/Only token owner could fractionalize it$/g);258  });259260  itWeb3('call nft2rft while not in list of allowed accounts', async ({api, web3, privateKeyWrapper}) => {261    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);262263    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);264    const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);265    const nftTokenId = await nftContract.methods.nextTokenId().call();266    await nftContract.methods.mint(owner, nftTokenId).send();267268    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);269270    await nftContract.methods.approve(fractionalizer.options.address, nftTokenId).send();271    await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).call())272      .to.eventually.be.rejectedWith(/Fractionalization of this collection is not allowed by admin$/g);273  });274275  itWeb3('call nft2rft while fractionalizer doesnt have approval for nft token', async ({api, web3, privateKeyWrapper}) => {276    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);277278    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);279    const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);280    const nftTokenId = await nftContract.methods.nextTokenId().call();281    await nftContract.methods.mint(owner, nftTokenId).send();282283    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);284285    await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, true).send();286    await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).call())287      .to.eventually.be.rejectedWith(/ApprovedValueTooLow$/g);288  });289290  itWeb3('call rft2nft without setting RFT collection for contract', async ({api, web3, privateKeyWrapper}) => {291    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);292293    const fractionalizer = await deployFractionalizer(api, web3, owner);294    const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);295    const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);296    const rftTokenId = await refungibleContract.methods.nextTokenId().call();297    await refungibleContract.methods.mint(owner, rftTokenId).send();298    299    await expect(fractionalizer.methods.rft2nft(rftCollectionAddress, rftTokenId).call())300      .to.eventually.be.rejectedWith(/RFT collection is not set$/g);301  });302303  itWeb3('call rft2nft for RFT token that is not from configured RFT collection', async ({api, web3, privateKeyWrapper}) => {304    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);305306    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);307    const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);308    const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);309    const rftTokenId = await refungibleContract.methods.nextTokenId().call();310    await refungibleContract.methods.mint(owner, rftTokenId).send();311    312    await expect(fractionalizer.methods.rft2nft(rftCollectionAddress, rftTokenId).call())313      .to.eventually.be.rejectedWith(/Wrong RFT collection$/g);314  });315316  itWeb3('call rft2nft for RFT token that was not minted by fractionalizer contract', async ({api, web3, privateKeyWrapper}) => {317    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);318    const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);319320    const fractionalizer = await deployFractionalizer(api, web3, owner);321    const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);322323    await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();324    await fractionalizer.methods.setRFTCollection(rftCollectionAddress).send();325326    const rftTokenId = await refungibleContract.methods.nextTokenId().call();327    await refungibleContract.methods.mint(owner, rftTokenId).send();328    329    await expect(fractionalizer.methods.rft2nft(rftCollectionAddress, rftTokenId).call())330      .to.eventually.be.rejectedWith(/No corresponding NFT token found$/g);331  });332333  itWeb3('call rft2nft without owning all RFT pieces', async ({api, web3, privateKeyWrapper}) => {334    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);335    const receiver = await createEthAccountWithBalance(api, web3, privateKeyWrapper);336337    const {fractionalizer, rftCollectionAddress} = await initFractionalizer(api, web3, privateKeyWrapper, owner);338    const {rftTokenAddress} = await createRFTToken(api, web3, owner, fractionalizer, 100n);339    340    const {tokenId} = tokenIdFromAddress(rftTokenAddress);341    const refungibleTokenContract = uniqueRefungibleToken(web3, rftTokenAddress, owner);342    await refungibleTokenContract.methods.transfer(receiver, 50).send();343    await refungibleTokenContract.methods.approve(fractionalizer.options.address, 50).send();344    await expect(fractionalizer.methods.rft2nft(rftCollectionAddress, tokenId).call())345      .to.eventually.be.rejectedWith(/Not all pieces are owned by the caller$/g);346  });347});
after · tests/src/eth/fractionalizer/fractionalizer.test.ts
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.161718import Web3 from 'web3';19import {ApiPromise} from '@polkadot/api';20import {evmToAddress} from '@polkadot/util-crypto';21import {readFile} from 'fs/promises';22import fractionalizerAbi from './FractionalizerAbi.json';23import {submitTransactionAsync} from '../../substrate/substrate-api';24import {UNIQUE} from '../../util/helpers';25import {collectionIdToAddress, createEthAccountWithBalance, createNonfungibleCollection, createRefungibleCollection, GAS_ARGS, itWeb3, tokenIdFromAddress, uniqueNFT, uniqueRefungible, uniqueRefungibleToken} from '../util/helpers';26import {Contract} from 'web3-eth-contract';2728import chai from 'chai';29import chaiAsPromised from 'chai-as-promised';30import chaiLike from 'chai-like';31import {IKeyringPair} from '@polkadot/types/types';32chai.use(chaiAsPromised);33chai.use(chaiLike);34const expect = chai.expect;3536async function deployFractionalizer(api: ApiPromise, web3: Web3, owner: string) {37  const fractionalizerContract = new web3.eth.Contract(fractionalizerAbi as any, undefined, {38    from: owner,39    ...GAS_ARGS,40  });41  return await fractionalizerContract.deploy({data: (await readFile(`${__dirname}/Fractionalizer.bin`)).toString()}).send({from: owner});42}4344async function initFractionalizer(api: ApiPromise, web3: Web3, privateKeyWrapper: (account: string) => IKeyringPair, owner: string) {45  const fractionalizer = await deployFractionalizer(api, web3, owner);46  const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);47  const alice = privateKeyWrapper('//Alice');48  await submitTransactionAsync(alice, tx);49  const result = await fractionalizer.methods.createAndSetRFTCollection('A', 'B', 'C').send();50  const rftCollectionAddress = result.events.RFTCollectionSet.returnValues._collection;51  return {fractionalizer, rftCollectionAddress};52}5354async function createRFTToken(api: ApiPromise, web3: Web3, owner: string, fractionalizer: Contract, amount: bigint) {55  const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);56  const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);57  const nftTokenId = await nftContract.methods.nextTokenId().call();58  await nftContract.methods.mint(owner, nftTokenId).send();5960  await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, true).send();61  await nftContract.methods.approve(fractionalizer.options.address, nftTokenId).send();62  const result = await fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, amount).send();63  const {_collection, _tokenId, _rftToken} = result.events.Fractionalized.returnValues;64  return {65    nftCollectionAddress: _collection,66    nftTokenId: _tokenId,67    rftTokenAddress: _rftToken,68  };69}7071describe('Fractionalizer contract usage', () => {72  itWeb3('Set RFT collection', async ({api, web3, privateKeyWrapper}) => {73    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);74    const fractionalizer = await deployFractionalizer(api, web3, owner);75    const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);76    const refungibleContract = uniqueRefungible(web3, collectionIdAddress, owner);77    await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();78    const result = await fractionalizer.methods.setRFTCollection(collectionIdAddress).send();79    expect(result.events).to.be.like({80      RFTCollectionSet: {81        returnValues: {82          _collection: collectionIdAddress,83        },84      },85    });86  });8788  itWeb3('Mint RFT collection', async ({api, web3, privateKeyWrapper}) => {89    const alice = privateKeyWrapper('//Alice');90    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);91    const fractionalizer = await deployFractionalizer(api, web3, owner);92    const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);93    await submitTransactionAsync(alice, tx);9495    const result = await fractionalizer.methods.createAndSetRFTCollection('A', 'B', 'C').send({from: owner});96    expect(result.events).to.be.like({97      RFTCollectionSet: {},98    });99    expect(result.events.RFTCollectionSet.returnValues._collection).to.be.ok;100  });101102  itWeb3('Set Allowlist', async ({api, web3, privateKeyWrapper}) => {103    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);104    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);    105106    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);107    const result1 = await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, true).send({from: owner});108    expect(result1.events).to.be.like({109      AllowListSet: {110        returnValues: {111          _collection: nftCollectionAddress,112          _status: true,113        },114      },115    });116    const result2 = await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, false).send({from: owner});117    expect(result2.events).to.be.like({118      AllowListSet: {119        returnValues: {120          _collection: nftCollectionAddress,121          _status: false,122        },123      },124    });125  });126127  itWeb3('NFT to RFT', async ({api, web3, privateKeyWrapper}) => {128    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);129130    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);131    const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);132    const nftTokenId = await nftContract.methods.nextTokenId().call();133    await nftContract.methods.mint(owner, nftTokenId).send();134135    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);136137    await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, true).send();138    await nftContract.methods.approve(fractionalizer.options.address, nftTokenId).send();139    const result = await fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).send();140    expect(result.events).to.be.like({141      Fractionalized: {142        returnValues: {143          _collection: nftCollectionAddress,144          _tokenId: nftTokenId,145          _amount: '100',146        },147      },148    });149    const rftTokenAddress = result.events.Fractionalized.returnValues._rftToken;150    const rftTokenContract = uniqueRefungibleToken(web3, rftTokenAddress, owner);151    expect(await rftTokenContract.methods.balanceOf(owner).call()).to.equal('100');152  });153154  itWeb3('RFT to NFT', async ({api, web3, privateKeyWrapper}) => {155    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);156157    const {fractionalizer, rftCollectionAddress} = await initFractionalizer(api, web3, privateKeyWrapper, owner);158    const {rftTokenAddress, nftCollectionAddress, nftTokenId} = await createRFTToken(api, web3, owner, fractionalizer, 100n);159160    const {collectionId, tokenId} = tokenIdFromAddress(rftTokenAddress);161    const refungibleAddress = collectionIdToAddress(collectionId);162    expect(rftCollectionAddress).to.be.equal(refungibleAddress);163    const refungibleTokenContract = uniqueRefungibleToken(web3, rftTokenAddress, owner);164    await refungibleTokenContract.methods.approve(fractionalizer.options.address, 100).send();165    const result = await fractionalizer.methods.rft2nft(refungibleAddress, tokenId).send();166    expect(result.events).to.be.like({167      Defractionalized: {168        returnValues: {169          _rftToken: rftTokenAddress,170          _nftCollection: nftCollectionAddress,171          _nftTokenId: nftTokenId,172        },173      },174    });175  });176});177178179180describe('Negative Integration Tests for fractionalizer', () => {181  itWeb3('call setRFTCollection twice', async ({api, web3, privateKeyWrapper}) => {182    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);183    const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);184    const refungibleContract = uniqueRefungible(web3, collectionIdAddress, owner);185186    const fractionalizer = await deployFractionalizer(api, web3, owner);187    await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();188    await fractionalizer.methods.setRFTCollection(collectionIdAddress).send();189190    await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())191      .to.eventually.be.rejectedWith(/RFT collection is already set$/g);192  });193194  itWeb3('call setRFTCollection with NFT collection', async ({api, web3, privateKeyWrapper}) => {195    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);196    const {collectionIdAddress} = await createNonfungibleCollection(api, web3, owner);197    const nftContract = uniqueNFT(web3, collectionIdAddress, owner);198199    const fractionalizer = await deployFractionalizer(api, web3, owner);200    await nftContract.methods.addCollectionAdmin(fractionalizer.options.address).send();201202    await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())203      .to.eventually.be.rejectedWith(/Wrong collection type. Collection is not refungible.$/g);204  });205206  itWeb3('call setRFTCollection while not collection admin', async ({api, web3, privateKeyWrapper}) => {207    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);208    const fractionalizer = await deployFractionalizer(api, web3, owner);209    const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);210211    await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())212      .to.eventually.be.rejectedWith(/Fractionalizer contract should be an admin of the collection$/g);213  });214215  itWeb3('call setRFTCollection after createAndSetRFTCollection', async ({api, web3, privateKeyWrapper}) => {216    const alice = privateKeyWrapper('//Alice');217    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);218    const fractionalizer = await deployFractionalizer(api, web3, owner);219    const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);220    await submitTransactionAsync(alice, tx);221222    const result = await fractionalizer.methods.createAndSetRFTCollection('A', 'B', 'C').send({from: owner});223    const collectionIdAddress = result.events.RFTCollectionSet.returnValues._collection;224225    await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).call())226      .to.eventually.be.rejectedWith(/RFT collection is already set$/g);227  });228229  itWeb3('call nft2rft without setting RFT collection for contract', async ({api, web3, privateKeyWrapper}) => {230    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);231232    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);233    const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);234    const nftTokenId = await nftContract.methods.nextTokenId().call();235    await nftContract.methods.mint(owner, nftTokenId).send();236237    const fractionalizer = await deployFractionalizer(api, web3, owner);238239    await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).call())240      .to.eventually.be.rejectedWith(/RFT collection is not set$/g);241  });242243  itWeb3('call nft2rft while not owner of NFT token', async ({api, web3, privateKeyWrapper}) => {244    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);245    const nftOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);246247    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);248    const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);249    const nftTokenId = await nftContract.methods.nextTokenId().call();250    await nftContract.methods.mint(owner, nftTokenId).send();251    await nftContract.methods.transfer(nftOwner, 1).send();252253254    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);255    await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, true).send();256257    await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).call())258      .to.eventually.be.rejectedWith(/Only token owner could fractionalize it$/g);259  });260261  itWeb3('call nft2rft while not in list of allowed accounts', async ({api, web3, privateKeyWrapper}) => {262    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);263264    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);265    const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);266    const nftTokenId = await nftContract.methods.nextTokenId().call();267    await nftContract.methods.mint(owner, nftTokenId).send();268269    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);270271    await nftContract.methods.approve(fractionalizer.options.address, nftTokenId).send();272    await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).call())273      .to.eventually.be.rejectedWith(/Fractionalization of this collection is not allowed by admin$/g);274  });275276  itWeb3('call nft2rft while fractionalizer doesnt have approval for nft token', async ({api, web3, privateKeyWrapper}) => {277    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);278279    const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);280    const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);281    const nftTokenId = await nftContract.methods.nextTokenId().call();282    await nftContract.methods.mint(owner, nftTokenId).send();283284    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);285286    await fractionalizer.methods.setNftCollectionIsAllowed(nftCollectionAddress, true).send();287    await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).call())288      .to.eventually.be.rejectedWith(/ApprovedValueTooLow$/g);289  });290291  itWeb3('call rft2nft without setting RFT collection for contract', async ({api, web3, privateKeyWrapper}) => {292    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);293294    const fractionalizer = await deployFractionalizer(api, web3, owner);295    const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);296    const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);297    const rftTokenId = await refungibleContract.methods.nextTokenId().call();298    await refungibleContract.methods.mint(owner, rftTokenId).send();299    300    await expect(fractionalizer.methods.rft2nft(rftCollectionAddress, rftTokenId).call())301      .to.eventually.be.rejectedWith(/RFT collection is not set$/g);302  });303304  itWeb3('call rft2nft for RFT token that is not from configured RFT collection', async ({api, web3, privateKeyWrapper}) => {305    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);306307    const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);308    const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);309    const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);310    const rftTokenId = await refungibleContract.methods.nextTokenId().call();311    await refungibleContract.methods.mint(owner, rftTokenId).send();312    313    await expect(fractionalizer.methods.rft2nft(rftCollectionAddress, rftTokenId).call())314      .to.eventually.be.rejectedWith(/Wrong RFT collection$/g);315  });316317  itWeb3('call rft2nft for RFT token that was not minted by fractionalizer contract', async ({api, web3, privateKeyWrapper}) => {318    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);319    const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);320321    const fractionalizer = await deployFractionalizer(api, web3, owner);322    const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);323324    await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();325    await fractionalizer.methods.setRFTCollection(rftCollectionAddress).send();326327    const rftTokenId = await refungibleContract.methods.nextTokenId().call();328    await refungibleContract.methods.mint(owner, rftTokenId).send();329    330    await expect(fractionalizer.methods.rft2nft(rftCollectionAddress, rftTokenId).call())331      .to.eventually.be.rejectedWith(/No corresponding NFT token found$/g);332  });333334  itWeb3('call rft2nft without owning all RFT pieces', async ({api, web3, privateKeyWrapper}) => {335    const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);336    const receiver = await createEthAccountWithBalance(api, web3, privateKeyWrapper);337338    const {fractionalizer, rftCollectionAddress} = await initFractionalizer(api, web3, privateKeyWrapper, owner);339    const {rftTokenAddress} = await createRFTToken(api, web3, owner, fractionalizer, 100n);340    341    const {tokenId} = tokenIdFromAddress(rftTokenAddress);342    const refungibleTokenContract = uniqueRefungibleToken(web3, rftTokenAddress, owner);343    await refungibleTokenContract.methods.transfer(receiver, 50).send();344    await refungibleTokenContract.methods.approve(fractionalizer.options.address, 50).send();345    await expect(fractionalizer.methods.rft2nft(rftCollectionAddress, tokenId).call())346      .to.eventually.be.rejectedWith(/Not all pieces are owned by the caller$/g);347  });348});