difftreelog
chore add check for fractionalizer error messages
in: master
2 files changed
tests/src/eth/fractionalizer/Fractionalizer.bindiffbeforeafterboth--- a/tests/src/eth/fractionalizer/Fractionalizer.bin
+++ b/tests/src/eth/fractionalizer/Fractionalizer.bin
@@ -1 +1 @@
-60c0604052600a60805269526546756e6769626c6560b01b60a0527fcdb72fd4e1d0d6d4eebd7ab142113ec2b4b06ddb24324db5c287ef01ab484d6b60055534801561004a57600080fd5b50600480546001600160a01b031916331790556113cd8061006c6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063115091401461005c578063b12527f814610071578063d470e60f14610084578063dbc38ad214610097578063f0d4cf5f146100aa575b600080fd5b61006f61006a366004610f34565b6100bd565b005b61006f61007f366004610f66565b6102b8565b61006f610092366004610f9f565b610345565b61006f6100a5366004610fcb565b610722565b61006f6100b8366004611062565b610dc4565b6004546001600160a01b031633146100f05760405162461bcd60e51b81526004016100e7906110fc565b60405180910390fd5b6000546001600160a01b0316156101495760405162461bcd60e51b815260206004820152601d60248201527f52465420636f6c6c656374696f6e20697320616c72656164792073657400000060448201526064016100e7565b60008190506000816001600160a01b031663d34b55b86040518163ffffffff1660e01b81526004016000604051808303816000875af1158015610190573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526101b8919081019061113a565b90506005548180519060200120146101e25760405162461bcd60e51b81526004016100e79061120a565b816001600160a01b03166304a460536040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102469190611267565b6102625760405162461bcd60e51b81526004016100e79061120a565b600080546001600160a01b0319166001600160a01b0385169081179091556040519081527f7186a599bf2297b1f4c8957d30b0965291eee0021a5f9a0aeb54dcbd1ffdceef9060200160405180910390a1505050565b6004546001600160a01b031633146102e25760405162461bcd60e51b81526004016100e7906110fc565b6001600160a01b038216600081815260016020908152604091829020805460ff19168515159081179091558251938452908301527f6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a11588910160405180910390a15050565b6000546001600160a01b03166103995760405162461bcd60e51b81526020600482015260196024820152781491950818dbdb1b1958dd1a5bdb881a5cc81b9bdd081cd95d603a1b60448201526064016100e7565b6000546001600160a01b038381169116146103ed5760405162461bcd60e51b81526020600482015260146024820152732bb937b7339029232a1031b7b63632b1ba34b7b760611b60448201526064016100e7565b600080546040516355bb7d6360e11b8152600481018490526001600160a01b039091169190829063ab76fac690602401602060405180830381865afa15801561043a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045e9190611284565b6001600160a01b0380821660009081526003602090815260409182902082518084019093528054909316808352600190930154908201529192506104e45760405162461bcd60e51b815260206004820181905260248201527f4e6f20636f72726573706f6e64696e67204e465420746f6b656e20666f756e6460448201526064016100e7565b6000829050806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054b91906112a1565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561058f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b391906112a1565b1461060f5760405162461bcd60e51b815260206004820152602660248201527f4e6f7420616c6c2070696563657320617265206f776e6564206279207468652060448201526531b0b63632b960d11b60648201526084016100e7565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd9061063f90339030908a906004016112ba565b600060405180830381600087803b15801561065957600080fd5b505af115801561066d573d6000803e3d6000fd5b5050835160208501516040516323b872dd60e01b81526001600160a01b0390921693506323b872dd92506106a791309133916004016112ba565b600060405180830381600087803b1580156106c157600080fd5b505af11580156106d5573d6000803e3d6000fd5b5050835160208501516040517fd2628c68a4330ea5ba2e16305b03a4e974e760e86f302d43e6bc00c28918cb2294506107129350879291906112ba565b60405180910390a1505050505050565b6000546001600160a01b03166107765760405162461bcd60e51b81526020600482015260196024820152781491950818dbdb1b1958dd1a5bdb881a5cc81b9bdd081cd95d603a1b60448201526064016100e7565b6000546040516331a9108f60e11b8152600481018490526001600160a01b0391821691339190861690636352211e90602401602060405180830381865afa1580156107c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e99190611284565b6001600160a01b03161461080f5760405162461bcd60e51b81526004016100e7906112de565b6001600160a01b03841660009081526001602081905260409091205460ff161515146108a35760405162461bcd60e51b815260206004820152603c60248201527f4672616374696f6e616c697a6174696f6e206f66207468697320636f6c6c656360448201527f74696f6e206973206e6f7420616c6c6f7765642062792061646d696e0000000060648201526084016100e7565b6040516331a9108f60e11b81526004810184905233906001600160a01b03861690636352211e90602401602060405180830381865afa1580156108ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090e9190611284565b6001600160a01b0316146109345760405162461bcd60e51b81526004016100e7906112de565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd90610964903390309088906004016112ba565b600060405180830381600087803b15801561097e57600080fd5b505af1158015610992573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600260209081526040808320868452909152812054819081908103610bde57836001600160a01b03166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2691906112a1565b6040516340c10f1960e01b8152306004820152602481018290529093506001600160a01b038516906340c10f19906044016020604051808303816000875af1158015610a76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9a9190611267565b506040516355bb7d6360e11b8152600481018490526001600160a01b0385169063ab76fac690602401602060405180830381865afa158015610ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b049190611284565b6001600160a01b0388811660008181526002602090815260408083208c84528252808320899055805180820182528481528083018d8152878716808652600390945293829020905181546001600160a01b0319169616959095178555915160019094019390935551630217888360e11b81526004810191909152602481018990529193508392509063042f1106906044016020604051808303816000875af1158015610bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd89190611267565b50610c6f565b6001600160a01b0387811660009081526002602090815260408083208a8452909152908190205490516355bb7d6360e11b8152600481018290529094509085169063ab76fac690602401602060405180830381865afa158015610c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c699190611284565b91508190505b60405163d2418ca760e01b81526001600160801b03861660048201526001600160a01b0382169063d2418ca7906024016020604051808303816000875af1158015610cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce29190611267565b5060405163a9059cbb60e01b81523360048201526001600160801b03861660248201526001600160a01b0382169063a9059cbb906044016020604051808303816000875af1158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c9190611267565b50604080516001600160a01b03808a168252602082018990528416918101919091526001600160801b03861660608201527f29f372538523984f33874da1b50e596ce0f180a6eb04d7ff22bb2ce80e1576b6906080015b60405180910390a150505050505050565b6004546001600160a01b03163314610dee5760405162461bcd60e51b81526004016100e7906110fc565b6000546001600160a01b031615610e475760405162461bcd60e51b815260206004820152601d60248201527f52465420636f6c6c656374696f6e20697320616c72656164792073657400000060448201526064016100e7565b6040516344a68ad560e01b8152736c4e9fe1ae37a41e93cee429e8e1881abdcbb54f9081906344a68ad590610e8a908a908a908a908a908a908a9060040161134e565b6020604051808303816000875af1158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecd9190611284565b600080546001600160a01b0319166001600160a01b039290921691821790556040519081527f7186a599bf2297b1f4c8957d30b0965291eee0021a5f9a0aeb54dcbd1ffdceef90602001610db3565b6001600160a01b0381168114610f3157600080fd5b50565b600060208284031215610f4657600080fd5b8135610f5181610f1c565b9392505050565b8015158114610f3157600080fd5b60008060408385031215610f7957600080fd5b8235610f8481610f1c565b91506020830135610f9481610f58565b809150509250929050565b60008060408385031215610fb257600080fd5b8235610fbd81610f1c565b946020939093013593505050565b600080600060608486031215610fe057600080fd5b8335610feb81610f1c565b92506020840135915060408401356001600160801b038116811461100e57600080fd5b809150509250925092565b60008083601f84011261102b57600080fd5b50813567ffffffffffffffff81111561104357600080fd5b60208301915083602082850101111561105b57600080fd5b9250929050565b6000806000806000806060878903121561107b57600080fd5b863567ffffffffffffffff8082111561109357600080fd5b61109f8a838b01611019565b909850965060208901359150808211156110b857600080fd5b6110c48a838b01611019565b909650945060408901359150808211156110dd57600080fd5b506110ea89828a01611019565b979a9699509497509295939492505050565b6020808252600e908201526d27b7363c9037bbb732b91031b0b760911b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561114d57600080fd5b825167ffffffffffffffff8082111561116557600080fd5b818501915085601f83011261117957600080fd5b81518181111561118b5761118b611124565b604051601f8201601f19908116603f011681019083821181831017156111b3576111b3611124565b8160405282815288868487010111156111cb57600080fd5b600093505b828410156111ed57848401860151818501870152928501926111d0565b828411156111fe5760008684830101525b98975050505050505050565b6020808252603c908201527f4672616374696f6e616c697a657220636f6e74726163742073686f756c64206260408201527f6520616e2061646d696e206f662074686520636f6c6c656374696f6e00000000606082015260800190565b60006020828403121561127957600080fd5b8151610f5181610f58565b60006020828403121561129657600080fd5b8151610f5181610f1c565b6000602082840312156112b357600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60208082526027908201527f4f6e6c7920746f6b656e206f776e657220636f756c64206672616374696f6e616040820152661b1a5e99481a5d60ca1b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600061136260608301888a611325565b8281036020840152611375818789611325565b9050828103604084015261138a818587611325565b999850505050505050505056fea2646970667358221220381fff79375dd0c60013c52b1abbe3b17b3f741fdced44aff45e10975d1d906f64736f6c634300080f0033
\ No newline at end of file
+60c0604052600a60805269526546756e6769626c6560b01b60a0527fcdb72fd4e1d0d6d4eebd7ab142113ec2b4b06ddb24324db5c287ef01ab484d6b60055534801561004a57600080fd5b50600480546001600160a01b031916331790556114138061006c6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063115091401461005c578063b12527f814610071578063d470e60f14610084578063dbc38ad214610097578063f0d4cf5f146100aa575b600080fd5b61006f61006a366004610fd7565b6100bd565b005b61006f61007f366004611009565b61035b565b61006f610092366004611042565b6103e8565b61006f6100a536600461106e565b6107c5565b61006f6100b8366004611105565b610e67565b6004546001600160a01b031633146100f05760405162461bcd60e51b81526004016100e79061119f565b60405180910390fd5b6000546001600160a01b0316156101495760405162461bcd60e51b815260206004820152601d60248201527f52465420636f6c6c656374696f6e20697320616c72656164792073657400000060448201526064016100e7565b60008190506000816001600160a01b031663d34b55b86040518163ffffffff1660e01b81526004016000604051808303816000875af1158015610190573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526101b891908101906111dd565b905060055481805190602001201461022f5760405162461bcd60e51b815260206004820152603460248201527f57726f6e6720636f6c6c656374696f6e20747970652e20436f6c6c656374696f604482015273371034b9903737ba103932b33ab733b4b136329760611b60648201526084016100e7565b816001600160a01b03166304a460536040518163ffffffff1660e01b81526004016020604051808303816000875af115801561026f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029391906112ad565b6103055760405162461bcd60e51b815260206004820152603c60248201527f4672616374696f6e616c697a657220636f6e74726163742073686f756c64206260448201527f6520616e2061646d696e206f662074686520636f6c6c656374696f6e0000000060648201526084016100e7565b600080546001600160a01b0319166001600160a01b0385169081179091556040519081527f7186a599bf2297b1f4c8957d30b0965291eee0021a5f9a0aeb54dcbd1ffdceef9060200160405180910390a1505050565b6004546001600160a01b031633146103855760405162461bcd60e51b81526004016100e79061119f565b6001600160a01b038216600081815260016020908152604091829020805460ff19168515159081179091558251938452908301527f6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a11588910160405180910390a15050565b6000546001600160a01b031661043c5760405162461bcd60e51b81526020600482015260196024820152781491950818dbdb1b1958dd1a5bdb881a5cc81b9bdd081cd95d603a1b60448201526064016100e7565b6000546001600160a01b038381169116146104905760405162461bcd60e51b81526020600482015260146024820152732bb937b7339029232a1031b7b63632b1ba34b7b760611b60448201526064016100e7565b600080546040516355bb7d6360e11b8152600481018490526001600160a01b039091169190829063ab76fac690602401602060405180830381865afa1580156104dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050191906112ca565b6001600160a01b0380821660009081526003602090815260409182902082518084019093528054909316808352600190930154908201529192506105875760405162461bcd60e51b815260206004820181905260248201527f4e6f20636f72726573706f6e64696e67204e465420746f6b656e20666f756e6460448201526064016100e7565b6000829050806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ee91906112e7565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610632573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065691906112e7565b146106b25760405162461bcd60e51b815260206004820152602660248201527f4e6f7420616c6c2070696563657320617265206f776e6564206279207468652060448201526531b0b63632b960d11b60648201526084016100e7565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd906106e290339030908a90600401611300565b600060405180830381600087803b1580156106fc57600080fd5b505af1158015610710573d6000803e3d6000fd5b5050835160208501516040516323b872dd60e01b81526001600160a01b0390921693506323b872dd925061074a9130913391600401611300565b600060405180830381600087803b15801561076457600080fd5b505af1158015610778573d6000803e3d6000fd5b5050835160208501516040517fd2628c68a4330ea5ba2e16305b03a4e974e760e86f302d43e6bc00c28918cb2294506107b5935087929190611300565b60405180910390a1505050505050565b6000546001600160a01b03166108195760405162461bcd60e51b81526020600482015260196024820152781491950818dbdb1b1958dd1a5bdb881a5cc81b9bdd081cd95d603a1b60448201526064016100e7565b6000546040516331a9108f60e11b8152600481018490526001600160a01b0391821691339190861690636352211e90602401602060405180830381865afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c91906112ca565b6001600160a01b0316146108b25760405162461bcd60e51b81526004016100e790611324565b6001600160a01b03841660009081526001602081905260409091205460ff161515146109465760405162461bcd60e51b815260206004820152603c60248201527f4672616374696f6e616c697a6174696f6e206f66207468697320636f6c6c656360448201527f74696f6e206973206e6f7420616c6c6f7765642062792061646d696e0000000060648201526084016100e7565b6040516331a9108f60e11b81526004810184905233906001600160a01b03861690636352211e90602401602060405180830381865afa15801561098d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b191906112ca565b6001600160a01b0316146109d75760405162461bcd60e51b81526004016100e790611324565b6040516323b872dd60e01b81526001600160a01b038516906323b872dd90610a0790339030908890600401611300565b600060405180830381600087803b158015610a2157600080fd5b505af1158015610a35573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600260209081526040808320868452909152812054819081908103610c8157836001600160a01b03166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac991906112e7565b6040516340c10f1960e01b8152306004820152602481018290529093506001600160a01b038516906340c10f19906044016020604051808303816000875af1158015610b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3d91906112ad565b506040516355bb7d6360e11b8152600481018490526001600160a01b0385169063ab76fac690602401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba791906112ca565b6001600160a01b0388811660008181526002602090815260408083208c84528252808320899055805180820182528481528083018d8152878716808652600390945293829020905181546001600160a01b0319169616959095178555915160019094019390935551630217888360e11b81526004810191909152602481018990529193508392509063042f1106906044016020604051808303816000875af1158015610c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7b91906112ad565b50610d12565b6001600160a01b0387811660009081526002602090815260408083208a8452909152908190205490516355bb7d6360e11b8152600481018290529094509085169063ab76fac690602401602060405180830381865afa158015610ce8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0c91906112ca565b91508190505b60405163d2418ca760e01b81526001600160801b03861660048201526001600160a01b0382169063d2418ca7906024016020604051808303816000875af1158015610d61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8591906112ad565b5060405163a9059cbb60e01b81523360048201526001600160801b03861660248201526001600160a01b0382169063a9059cbb906044016020604051808303816000875af1158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff91906112ad565b50604080516001600160a01b03808a168252602082018990528416918101919091526001600160801b03861660608201527f29f372538523984f33874da1b50e596ce0f180a6eb04d7ff22bb2ce80e1576b6906080015b60405180910390a150505050505050565b6004546001600160a01b03163314610e915760405162461bcd60e51b81526004016100e79061119f565b6000546001600160a01b031615610eea5760405162461bcd60e51b815260206004820152601d60248201527f52465420636f6c6c656374696f6e20697320616c72656164792073657400000060448201526064016100e7565b6040516344a68ad560e01b8152736c4e9fe1ae37a41e93cee429e8e1881abdcbb54f9081906344a68ad590610f2d908a908a908a908a908a908a90600401611394565b6020604051808303816000875af1158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7091906112ca565b600080546001600160a01b0319166001600160a01b039290921691821790556040519081527f7186a599bf2297b1f4c8957d30b0965291eee0021a5f9a0aeb54dcbd1ffdceef90602001610e56565b6001600160a01b0381168114610fd457600080fd5b50565b600060208284031215610fe957600080fd5b8135610ff481610fbf565b9392505050565b8015158114610fd457600080fd5b6000806040838503121561101c57600080fd5b823561102781610fbf565b9150602083013561103781610ffb565b809150509250929050565b6000806040838503121561105557600080fd5b823561106081610fbf565b946020939093013593505050565b60008060006060848603121561108357600080fd5b833561108e81610fbf565b92506020840135915060408401356001600160801b03811681146110b157600080fd5b809150509250925092565b60008083601f8401126110ce57600080fd5b50813567ffffffffffffffff8111156110e657600080fd5b6020830191508360208285010111156110fe57600080fd5b9250929050565b6000806000806000806060878903121561111e57600080fd5b863567ffffffffffffffff8082111561113657600080fd5b6111428a838b016110bc565b9098509650602089013591508082111561115b57600080fd5b6111678a838b016110bc565b9096509450604089013591508082111561118057600080fd5b5061118d89828a016110bc565b979a9699509497509295939492505050565b6020808252600e908201526d27b7363c9037bbb732b91031b0b760911b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156111f057600080fd5b825167ffffffffffffffff8082111561120857600080fd5b818501915085601f83011261121c57600080fd5b81518181111561122e5761122e6111c7565b604051601f8201601f19908116603f01168101908382118183101715611256576112566111c7565b81604052828152888684870101111561126e57600080fd5b600093505b828410156112905784840186015181850187015292850192611273565b828411156112a15760008684830101525b98975050505050505050565b6000602082840312156112bf57600080fd5b8151610ff481610ffb565b6000602082840312156112dc57600080fd5b8151610ff481610fbf565b6000602082840312156112f957600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60208082526027908201527f4f6e6c7920746f6b656e206f776e657220636f756c64206672616374696f6e616040820152661b1a5e99481a5d60ca1b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006113a860608301888a61136b565b82810360208401526113bb81878961136b565b905082810360408401526113d081858761136b565b999850505050505050505056fea264697066735822122076db6351e378a745dfecb1c0576ec9ca58040462c9a47115687f3fe3235761ef64736f6c634300080f0033
\ No newline at end of file
tests/src/eth/fractionalizer/fractionalizer.test.tsdiffbeforeafterboth1// 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.mintRFTCollection('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.setAllowlist(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.mintRFTCollection('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.setAllowlist(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.setAllowlist(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.setAllowlist(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 fractionalizer = await deployFractionalizer(api, web3, owner);184 const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);185 const refungibleContract = uniqueRefungible(web3, collectionIdAddress, owner);186 await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();187 await fractionalizer.methods.setRFTCollection(collectionIdAddress).send();188189 await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).send()).to.be.eventually.rejected;190 });191192 itWeb3('call setRFTCollection with NFT collection', async ({api, web3, privateKeyWrapper}) => {193 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);194 const fractionalizer = await deployFractionalizer(api, web3, owner);195 const {collectionIdAddress} = await createNonfungibleCollection(api, web3, owner);196197 await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).send()).to.be.eventually.rejected;198 });199200 itWeb3('call setRFTCollection while not collection admin', async ({api, web3, privateKeyWrapper}) => {201 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);202 const fractionalizer = await deployFractionalizer(api, web3, owner);203 const {collectionIdAddress} = await createRefungibleCollection(api, web3, owner);204205 await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).send()).to.be.eventually.rejected;206 });207208 itWeb3('call setRFTCollection after mintRFTCollection', async ({api, web3, privateKeyWrapper}) => {209 const alice = privateKeyWrapper('//Alice');210 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);211 const fractionalizer = await deployFractionalizer(api, web3, owner);212 const tx = api.tx.balances.transfer(evmToAddress(fractionalizer.options.address), 10n * UNIQUE);213 await submitTransactionAsync(alice, tx);214215 const result = await fractionalizer.methods.mintRFTCollection('A', 'B', 'C').send({from: owner});216 const collectionIdAddress = result.events.RFTCollectionSet.returnValues._collection;217218 await expect(fractionalizer.methods.setRFTCollection(collectionIdAddress).send()).to.be.eventually.rejected;219 });220221 itWeb3('call nft2rft without setting RFT collection for contract', async ({api, web3, privateKeyWrapper}) => {222 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);223224 const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);225 const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);226 const nftTokenId = await nftContract.methods.nextTokenId().call();227 await nftContract.methods.mint(owner, nftTokenId).send();228229 const fractionalizer = await deployFractionalizer(api, web3, owner);230231 await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).send()).to.be.eventually.rejected;232 });233234 itWeb3('call nft2rft while not owner of NFT token', async ({api, web3, privateKeyWrapper}) => {235 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);236 const nftOwner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);237238 const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);239 const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);240 const nftTokenId = await nftContract.methods.nextTokenId().call();241 await nftContract.methods.mint(owner, nftTokenId).send();242 await nftContract.methods.transfer(nftOwner, 1).send();243244245 const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);246247 await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).send()).to.be.eventually.rejected;248 });249250 itWeb3('call nft2rft while not in list of allowed accounts', async ({api, web3, privateKeyWrapper}) => {251 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);252253 const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);254 const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);255 const nftTokenId = await nftContract.methods.nextTokenId().call();256 await nftContract.methods.mint(owner, nftTokenId).send();257258 const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);259260 await nftContract.methods.approve(fractionalizer.options.address, nftTokenId).send();261 await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).send()).to.be.eventually.rejected;262 });263264 itWeb3('call nft2rft while fractionalizer doesnt have approval for nft token', async ({api, web3, privateKeyWrapper}) => {265 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);266267 const {collectionIdAddress: nftCollectionAddress} = await createNonfungibleCollection(api, web3, owner);268 const nftContract = uniqueNFT(web3, nftCollectionAddress, owner);269 const nftTokenId = await nftContract.methods.nextTokenId().call();270 await nftContract.methods.mint(owner, nftTokenId).send();271272 const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, owner);273274 await fractionalizer.methods.setAllowlist(nftCollectionAddress, true).send();275 await expect(fractionalizer.methods.nft2rft(nftCollectionAddress, nftTokenId, 100).send()).to.be.eventually.rejected;276 });277278 itWeb3('call rft2nft without setting RFT collection for contract', async ({api, web3, privateKeyWrapper}) => {279 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);280281 const fractionalizer = await deployFractionalizer(api, web3, owner);282 const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);283 const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);284 const rftTokenId = await refungibleContract.methods.nextTokenId().call();285 await refungibleContract.methods.mint(owner, rftTokenId).send();286 287 await expect(fractionalizer.methods.rft2nft(rftCollectionAddress, rftTokenId).send()).to.be.eventually.rejected;288 });289290 itWeb3('call rft2nft for RFT token that is not from configured RFT collection', async ({api, web3, privateKeyWrapper}) => {291 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);292293 const {fractionalizer} = await initFractionalizer(api, web3, privateKeyWrapper, 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).send()).to.be.eventually.rejected;300 });301302 itWeb3('call rft2nft for RFT token that was not minted by fractionalizer contract', async ({api, web3, privateKeyWrapper}) => {303 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);304 const {collectionIdAddress: rftCollectionAddress} = await createRefungibleCollection(api, web3, owner);305306 const fractionalizer = await deployFractionalizer(api, web3, owner);307 const refungibleContract = uniqueRefungible(web3, rftCollectionAddress, owner);308309 await refungibleContract.methods.addCollectionAdmin(fractionalizer.options.address).send();310 await fractionalizer.methods.setRFTCollection(rftCollectionAddress).send();311312 const rftTokenId = await refungibleContract.methods.nextTokenId().call();313 await refungibleContract.methods.mint(owner, rftTokenId).send();314 315 await expect(await fractionalizer.methods.rft2nft(rftCollectionAddress, rftTokenId).send()).to.be.eventually.rejected;316 });317318 itWeb3('call rft2nft without owning all RFT pieces', async ({api, web3, privateKeyWrapper}) => {319 const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);320 const receiver = await createEthAccountWithBalance(api, web3, privateKeyWrapper);321322 const {fractionalizer, rftCollectionAddress} = await initFractionalizer(api, web3, privateKeyWrapper, owner);323 const {rftTokenAddress} = await createRFTToken(api, web3, owner, fractionalizer, 100n);324 325 const {tokenId} = tokenIdFromAddress(rftTokenAddress);326 const refungibleTokenContract = uniqueRefungibleToken(web3, rftTokenAddress, owner);327 await refungibleTokenContract.methods.transfer(receiver, 50).send();328 await refungibleTokenContract.methods.approve(fractionalizer.options.address, 50).send();329 await expect(fractionalizer.methods.rft2nft(rftCollectionAddress, tokenId).send()).to.be.eventually.rejected;330 });331});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.mintRFTCollection('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.setAllowlist(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.mintRFTCollection('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.setAllowlist(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.setAllowlist(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.setAllowlist(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 mintRFTCollection', 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.mintRFTCollection('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.setAllowlist(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});