git.delta.rocks / unique-network / refs/commits / 7a0df1a2d7c5

difftreelog

MarketPlace.sol from unique-marketplace

Andrey2022-11-10parent: #7bd00bb.patch.diff
in: master

5 files changed

deletedtests/src/eth/marketplace/MarketPlace.abidiffbeforeafterboth

no changes

deletedtests/src/eth/marketplace/MarketPlace.bindiffbeforeafterboth
--- a/tests/src/eth/marketplace/MarketPlace.bin
+++ /dev/null
@@ -1 +0,0 @@
-60806040523480156200001157600080fd5b50604051620029b8380380620029b8833981016040819052620000349162000327565b600580546001600160a01b038084166001600160a01b03199283161790925560068054821633179055604080516101408101825260008082526020808301828152838501838152606085018481526080860185815260a0870186815260c0880187815289518088018b5288815260e08a019081528a518089018c528981526101008b01528a51808901909b52888b526101208a019a909a528754600181018955978052885160099098027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810198895595517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56487018054918e16918d1691909117905593517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56586015591517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e566850155517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56784018054918b16919099161790975595517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56882018054975160ff16600160a01b026001600160a81b0319909816919098161795909517909555915180519194929362000239937f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5699091019291019062000281565b5061010082015180516200025891600784019160209091019062000281565b5061012082015180516200027791600884019160209091019062000281565b5050505062000396565b8280546200028f9062000359565b90600052602060002090601f016020900481019282620002b35760008555620002fe565b82601f10620002ce57805160ff1916838001178555620002fe565b82800160010185558215620002fe579182015b82811115620002fe578251825591602001919060010190620002e1565b506200030c92915062000310565b5090565b5b808211156200030c576000815560010162000311565b6000602082840312156200033a57600080fd5b81516001600160a01b03811681146200035257600080fd5b9392505050565b600181811c908216806200036e57607f821691505b602082108114156200039057634e487b7160e01b600052602260045260246000fd5b50919050565b61261280620003a66000396000f3fe6080604052600436106101025760003560e01c806399f2d4eb11610095578063c10c354611610064578063c10c354614610221578063cce7ec1314610378578063e22d4f7d1461038b578063edb25841146103c3578063fd8868c7146103f057610184565b806399f2d4eb146102c5578063a85c38ef146102e5578063b460af941461031b578063b4c3e8ea1461034b57610184565b80636b084b25116100d15780636b084b2514610241578063791bd866146102615780638c088f001461028157806393cdd334146102a557610184565b806337c4eb58146101bf5780633ce61756146101e157806340b8074614610201578063592bd7051461022157610184565b366101845760405162461bcd60e51b815260206004820152604160248201527f43616e277420616363657074207061796d656e7420776974686f757420636f6c60448201527f6c656374696f6e20616e64204944732c20757365206441707020746f2073656e6064820152601960fa1b608482015260a4015b60405180910390fd5b60405162461bcd60e51b815260206004820152601060248201526f27379039bab1b410333ab731ba34b7b760811b604482015260640161017b565b3480156101cb57600080fd5b506101df6101da366004612054565b610410565b005b3480156101ed57600080fd5b506101df6101fc36600461209c565b610979565b34801561020d57600080fd5b506101df61021c3660046120c0565b6109c5565b34801561022d57600080fd5b506101df61023c36600461209c565b610c27565b34801561024d57600080fd5b506101df61025c3660046120ec565b610c73565b34801561026d57600080fd5b506101df61027c366004612151565b610ee6565b34801561028d57600080fd5b506000545b6040519081526020015b60405180910390f35b3480156102b157600080fd5b506102926102c036600461209c565b610fb1565b3480156102d157600080fd5b506102926102e03660046120c0565b61105e565b3480156102f157600080fd5b50610305610300366004612181565b61108f565b60405161029c9a999897969594939291906121f6565b34801561032757600080fd5b5061033b610336366004612283565b6112a0565b604051901515815260200161029c565b34801561035757600080fd5b5061029261036636600461209c565b60026020526000908152604090205481565b61033b6103863660046120c0565b6113d2565b34801561039757600080fd5b506102926103a63660046120c0565b600360209081526000928352604080842090915290825290205481565b3480156103cf57600080fd5b506103e36103de3660046120c0565b61181b565b60405161029c91906122c5565b3480156103fc57600080fd5b506101df61040b3660046123a5565b611b0c565b6040516331a9108f60e11b8152600481018290526000906001600160a01b03841690636352211e90602401602060405180830381865afa158015610458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047c91906123f8565b90506001600160a01b03811633146104d65760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c7920746f6b656e206f776e65722063616e206d616b652061736b000000604482015260640161017b565b6060806060856001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561053a57506040513d6000823e601f3d908101601f19168201604052610537919081019061242b565b60015b61055557604051806020016040528060008152509250610558565b92505b856001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa9250505080156105b757506040513d6000823e601f3d908101601f191682016040526105b4919081019061242b565b60015b6105d2576040518060200160405280600081525091506105d5565b91505b60405163c87b56dd60e01b8152600481018690526001600160a01b0387169063c87b56dd90602401600060405180830381865afa92505050801561063b57506040513d6000823e601f3d908101601f19168201604052610638919081019061242b565b60015b6106545750604080516020810190915260008152610657565b90505b60408051610140810182528681526001600160a01b03808a1660208084019182529383018c815242606085019081528b8416608086019081523360a08701908152600160c0880181815260e089018d81526101008a018d90526101208a018c90526000805493840181558052895160099093027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810193845597517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56489018054918b166001600160a01b031992831617905596517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56589015594517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56688015592517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e567870180549189169190961617909455517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56885018054925160ff16600160a01b026001600160a81b03199093169190961617179093559151805193949293610828937f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e569909301929190910190611fa3565b506101008201518051610845916007840191602090910190611fa3565b506101208201518051610862916008840191602090910190611fa3565b505060008054909150610877906001906124ee565b6001600160a01b03881660008181526003602090815260408083208b84528252808320859055338084526004808452828520805460018101825590865293909420909201859055516323b872dd60e01b815293945091926323b872dd926108e492909130918c9101612505565b600060405180830381600087803b1580156108fe57600080fd5b505af1158015610912573d6000803e3d6000fd5b5050604080518c81526001600160a01b038c811660208301528b1681830152606081018a90526080810185905290517f83b3a8754d705365b581ab63c329c1e55255a22aa78c67b5fcef378bfb2d9b9993509081900360a0019150a1505050505050505050565b6006546001600160a01b031633146109a35760405162461bcd60e51b815260040161017b90612529565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166000908152600360209081526040808320848452909152812054815490913391839081106109ff576109ff612551565b60009182526020909120600560099092020101546001600160a01b031614610a695760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c7920746f6b656e206f776e65722063616e20656469742061736b000000604482015260640161017b565b60008181548110610a7c57610a7c612551565b6000918252602090912060099091020160050154600160a01b900460ff16610adb5760405162461bcd60e51b8152602060048201526012602482015271151a1a5cc8185cdac81a5cc818db1bdcd95960721b604482015260640161017b565b4260008281548110610aef57610aef612551565b9060005260206000209060090201600301819055506000808281548110610b1857610b18612551565b906000526020600020906009020160050160146101000a81548160ff021916908360ff160217905550826001600160a01b03166323b872dd3060008481548110610b6457610b64612551565b60009182526020909120600560099092020101546040516001600160e01b031960e085901b168152610ba592916001600160a01b0316908790600401612505565b600060405180830381600087803b158015610bbf57600080fd5b505af1158015610bd3573d6000803e3d6000fd5b5050604080516001600160a01b0387168152602081018690529081018490527f6330f58b476cc7f9dd8db8130a0fbb49b291ebc32531eb36e9646f56ee20174b9250606001905060405180910390a1505050565b6006546001600160a01b03163314610c515760405162461bcd60e51b815260040161017b90612529565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316600090815260036020908152604080832085845290915281205481549091339183908110610cad57610cad612551565b60009182526020909120600560099092020101546001600160a01b031614610d175760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c7920746f6b656e206f776e65722063616e20656469742061736b000000604482015260640161017b565b60008181548110610d2a57610d2a612551565b6000918252602090912060099091020160050154600160a01b900460ff16610d895760405162461bcd60e51b8152602060048201526012602482015271151a1a5cc8185cdac81a5cc818db1bdcd95960721b604482015260640161017b565b8515610db9578560008281548110610da357610da3612551565b9060005260206000209060090201600201819055505b6001600160a01b03851615610e12578460008281548110610ddc57610ddc612551565b906000526020600020906009020160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b4260008281548110610e2657610e26612551565b9060005260206000209060090201600301819055508160008281548110610e4f57610e4f612551565b600091825260209182902060099190910201600501805460ff60a01b1916600160a01b60ff94851602179055604080518981526001600160a01b03898116938201939093529187169082015260608101859052908316608082015260a081018290527f04211d838289b72af597bf28a4ccff5a30d6056f5fce2eddb127ab4ffea0963d9060c00160405180910390a1505050505050565b6005546001600160a01b03163314610f325760405162461bcd60e51b815260206004820152600f60248201526e27b7363c9032b9b1b937bb9031b0b760891b604482015260640161017b565b6001600160a01b038116600090815260026020526040902054610f56908390612567565b6001600160a01b038216600081815260026020908152604091829020939093558051858152928301919091527f291ce0b690061cb1b3f1111bf6500efe526983251fb0f863251ec3670d035fc4910160405180910390a15050565b6005546000906001600160a01b031633146110005760405162461bcd60e51b815260206004820152600f60248201526e27b7363c9032b9b1b937bb9031b0b760891b604482015260640161017b565b506001600160a01b03811660008181526002602090815260408083208054939055805193845290830182905290917f027aeacbc6fbfa7fe735ff8f14a600469ad1a3197ce1c8c8a159641cf68fe592910160405180910390a1919050565b6004602052816000526040600020818154811061107a57600080fd5b90600052602060002001600091509150505481565b6000818154811061109f57600080fd5b600091825260209091206009909102018054600182015460028301546003840154600485015460058601546006870180549698506001600160a01b0395861697949693959283169492821693600160a01b90920460ff1692916111019061257f565b80601f016020809104026020016040519081016040528092919081815260200182805461112d9061257f565b801561117a5780601f1061114f5761010080835404028352916020019161117a565b820191906000526020600020905b81548152906001019060200180831161115d57829003601f168201915b50505050509080600701805461118f9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb9061257f565b80156112085780601f106111dd57610100808354040283529160200191611208565b820191906000526020600020905b8154815290600101906020018083116111eb57829003601f168201915b50505050509080600801805461121d9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546112499061257f565b80156112965780601f1061126b57610100808354040283529160200191611296565b820191906000526020600020905b81548152906001019060200180831161127957829003601f168201915b505050505090508a565b6006546000906001600160a01b031633146112cd5760405162461bcd60e51b815260040161017b90612529565b6007546001600160a01b0384811691161461135b5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820186905284169063a9059cbb906044016020604051808303816000875af1158015611331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135591906125ba565b50611382565b6040516001600160a01b0383169085156108fc029086906000818181858888f19450505050505b604080518581526001600160a01b03858116602083015284168183015290517fb524bace85e4ce0f8da306e32f39263c5724780ca00b7551c051c8e3dc36adaf9181900360600190a19392505050565b6001600160a01b0382166000908152600360209081526040808320848452909152812054815482918291811061140a5761140a612551565b600091825260209182902060408051610140810182526009939093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015483166080830152600581015492831660a0830152600160a01b90920460ff1660c082015260068201805491929160e08401919061149b9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546114c79061257f565b80156115145780601f106114e957610100808354040283529160200191611514565b820191906000526020600020905b8154815290600101906020018083116114f757829003601f168201915b5050505050815260200160078201805461152d9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546115599061257f565b80156115a65780601f1061157b576101008083540402835291602001916115a6565b820191906000526020600020905b81548152906001019060200180831161158957829003601f168201915b505050505081526020016008820180546115bf9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546115eb9061257f565b80156116385780601f1061160d57610100808354040283529160200191611638565b820191906000526020600020905b81548152906001019060200180831161161b57829003601f168201915b5050505050815250509050806040015134146116ac5760405162461bcd60e51b815260206004820152602d60248201527f4e6f7420726967687420616d6f756e742073656e742c206861766520746f206260448201526c6520657175616c20707269636560981b606482015260840161017b565b6001600160a01b0384166000908152600360209081526040808320868452909152812054815482919081106116e3576116e3612551565b906000526020600020906009020160050160146101000a81548160ff021916908360ff160217905550836001600160a01b03166323b872dd3033866040518463ffffffff1660e01b815260040161173c93929190612505565b600060405180830381600087803b15801561175657600080fd5b505af115801561176a573d6000803e3d6000fd5b505050508060a001516001600160a01b03166108fc82604001519081150290604051600060405180830381858888f16001600160a01b03891660008181526003602090815260408083208c8452825291829020548983015183519485529184018c90529183019190915260608201529096507fc220cf2a12d6492e23ed1141c55018997799699d009b00ebd5a4874c60f5c31e9450608001925061180c915050565b60405180910390a15092915050565b61188f6040518061014001604052806000815260200160006001600160a01b03168152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600060ff1681526020016060815260200160608152602001606081525090565b6001600160a01b038316600090815260036020908152604080832085845290915281205481549091908190839081106118ca576118ca612551565b600091825260209182902060408051610140810182526009939093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015483166080830152600581015492831660a0830152600160a01b90920460ff1660c082015260068201805491929160e08401919061195b9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546119879061257f565b80156119d45780601f106119a9576101008083540402835291602001916119d4565b820191906000526020600020905b8154815290600101906020018083116119b757829003601f168201915b505050505081526020016007820180546119ed9061257f565b80601f0160208091040260200160405190810160405280929190818152602001828054611a199061257f565b8015611a665780601f10611a3b57610100808354040283529160200191611a66565b820191906000526020600020905b815481529060010190602001808311611a4957829003601f168201915b50505050508152602001600882018054611a7f9061257f565b80601f0160208091040260200160405190810160405280929190818152602001828054611aab9061257f565b8015611af85780601f10611acd57610100808354040283529160200191611af8565b820191906000526020600020905b815481529060010190602001808311611adb57829003601f168201915b505050919092525091979650505050505050565b6001600160a01b038416600090815260036020908152604080832086845290915281205481548291908110611b4357611b43612551565b600091825260209182902060408051610140810182526009939093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015483166080830152600581015492831660a0830152600160a01b90920460ff1660c082015260068201805491929160e084019190611bd49061257f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c009061257f565b8015611c4d5780601f10611c2257610100808354040283529160200191611c4d565b820191906000526020600020905b815481529060010190602001808311611c3057829003601f168201915b50505050508152602001600782018054611c669061257f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c929061257f565b8015611cdf5780601f10611cb457610100808354040283529160200191611cdf565b820191906000526020600020905b815481529060010190602001808311611cc257829003601f168201915b50505050508152602001600882018054611cf89061257f565b80601f0160208091040260200160405190810160405280929190818152602001828054611d249061257f565b8015611d715780601f10611d4657610100808354040283529160200191611d71565b820191906000526020600020905b815481529060010190602001808311611d5457829003601f168201915b505050919092525050600554919250506001600160a01b0316331480611d9f5750336001600160a01b038416145b611df75760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920657363726f77206f722062757965722063616e2063616c6c206275604482015263794b534d60e01b606482015260840161017b565b6040808201516001600160a01b038516600090815260026020529190912054611e2091906124ee565b6001600160a01b03808516600090815260026020526040808220939093558383015160a085015190921681529190912054611e5b9190612567565b60a08201516001600160a01b039081166000908152600260209081526040808320949094559188168152600382528281208782529091529081205481548291908110611ea957611ea9612551565b906000526020600020906009020160050160146101000a81548160ff021916908360ff160217905550846001600160a01b03166323b872dd3084876040518463ffffffff1660e01b8152600401611f0293929190612505565b600060405180830381600087803b158015611f1c57600080fd5b505af1158015611f30573d6000803e3d6000fd5b505050506001600160a01b038516600081815260036020908152604080832088845282529182902054848301518351948552918401889052838301526060830152517f68bdd3548f3f05742b376651745ca73472eb18f2230f64b893d7a48e575eb0149181900360800190a15050505050565b828054611faf9061257f565b90600052602060002090601f016020900481019282611fd15760008555612017565b82601f10611fea57805160ff1916838001178555612017565b82800160010185558215612017579182015b82811115612017578251825591602001919060010190611ffc565b50612023929150612027565b5090565b5b808211156120235760008155600101612028565b6001600160a01b038116811461205157600080fd5b50565b6000806000806080858703121561206a57600080fd5b84359350602085013561207c8161203c565b9250604085013561208c8161203c565b9396929550929360600135925050565b6000602082840312156120ae57600080fd5b81356120b98161203c565b9392505050565b600080604083850312156120d357600080fd5b82356120de8161203c565b946020939093013593505050565b600080600080600060a0868803121561210457600080fd5b8535945060208601356121168161203c565b935060408601356121268161203c565b925060608601359150608086013560ff8116811461214357600080fd5b809150509295509295909350565b6000806040838503121561216457600080fd5b8235915060208301356121768161203c565b809150509250929050565b60006020828403121561219357600080fd5b5035919050565b60005b838110156121b557818101518382015260200161219d565b838111156121c4576000848401525b50505050565b600081518084526121e281602086016020860161219a565b601f01601f19169290920160200192915050565b8a81526001600160a01b038a81166020830152604082018a9052606082018990528781166080830152861660a082015260ff851660c082015261014060e08201819052600090612248838201876121ca565b905082810361010084015261225d81866121ca565b905082810361012084015261227281856121ca565b9d9c50505050505050505050505050565b60008060006060848603121561229857600080fd5b8335925060208401356122aa8161203c565b915060408401356122ba8161203c565b809150509250925092565b6020815281516020820152600060208301516122ec60408401826001600160a01b03169052565b506040830151606083015260608301516080830152608083015161231b60a08401826001600160a01b03169052565b5060a08301516001600160a01b03811660c08401525060c083015160ff811660e08401525060e0830151610140610100818186015261235e6101608601846121ca565b9250808601519050601f1961012081878603018188015261237f85846121ca565b90880151878203909201848801529350905061239b83826121ca565b9695505050505050565b600080600080608085870312156123bb57600080fd5b84356123c68161203c565b93506020850135925060408501356123dd8161203c565b915060608501356123ed8161203c565b939692955090935050565b60006020828403121561240a57600080fd5b81516120b98161203c565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561243d57600080fd5b815167ffffffffffffffff8082111561245557600080fd5b818401915084601f83011261246957600080fd5b81518181111561247b5761247b612415565b604051601f8201601f19908116603f011681019083821181831017156124a3576124a3612415565b816040528281528760208487010111156124bc57600080fd5b6124cd83602083016020880161219a565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600082821015612500576125006124d8565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252600e908201526d27b7363c9037bbb732b91031b0b760911b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000821982111561257a5761257a6124d8565b500190565b600181811c9082168061259357607f821691505b602082108114156125b457634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156125cc57600080fd5b815180151581146120b957600080fdfea26469706673582212205a8295bbb792776496ccaaa9cb7384efe95af6490ca8015ceb6eb22e5ab3ae6b64736f6c634300080a0033
\ No newline at end of file
modifiedtests/src/eth/marketplace/MarketPlace.soldiffbeforeafterboth
--- a/tests/src/eth/marketplace/MarketPlace.sol
+++ b/tests/src/eth/marketplace/MarketPlace.sol
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier:  Apache License
 pragma solidity >=0.8.0;
-import "../api/UniqueNFT.sol";
+import {UniqueNFT, Dummy, ERC165} from "../api/UniqueNFT.sol";
 
 // Inline
 interface ERC20Events {
@@ -52,8 +52,9 @@
 
 contract MarketPlace {
     struct Order {
+        
         uint256 idNFT;
-        address currencyCode; // UNIQ tokens as address address (1); wKSM
+        address currencyCode; // UNIQ tokens as address address (1); wKSM 
         uint256 price;
         uint256 time;
         address idCollection;
@@ -61,330 +62,353 @@
         uint8 flagActive;
         string name;
         string symbol;
-        string tokenURI;
+        string tokenURI;        
     }
-    Order[] public orders;
-    uint256 test;
-    mapping(address => uint256) public balanceKSM; //  [ownerAddr][currency] => [KSMs]
-    mapping(address => mapping(uint256 => uint256)) public asks; // [buyer][idCollection][idNFT] => idorder
+    Order[] public  orders;
+    uint test;
+    mapping (address => uint256) public balanceKSM;  //  [ownerAddr][currency] => [KSMs]
+    mapping (address => mapping (uint256 => uint256)) public  asks ; // [buyer][idCollection][idNFT] => idorder
+    mapping (address => mapping (uint => uint[])) public ordersbyNFT; // [addressCollection] =>idNFT =>idorder
+
+    mapping (address => uint[]) public asksbySeller; // [addressSeller] =>idorder
 
-    mapping(address => uint256[]) public asksbySeller; // [addressSeller] =>idorder
+    mapping (address =>bool) internal isEscrow;
 
-    address escrow;
+    //address escrow;
     address owner;
     address nativecoin;
 
-    constructor(address _escrow) {
-        escrow = _escrow;
+    // from abstract contract ReentrancyGuard 
+    // Booleans are more expensive than uint256 or any type that takes up a full
+    // word because each write operation emits an extra SLOAD to first read the
+    // slot's contents, replace the bits taken up by the boolean, and then write
+    // back. This is the compiler's defense against contract upgrades and
+    // pointer aliasing, and it cannot be disabled.
+
+    // The values being non-zero value makes deployment a bit more expensive,
+    // but in exchange the refund on every call to nonReentrant will be lower in
+    // amount. Since refunds are capped to a percentage of the total
+    // transaction's gas, it is best to keep them low in cases like this one, to
+    // increase the likelihood of the full refund coming into effect.
+    uint8 private constant _NOT_ENTERED = 1;
+    uint8 private constant _ENTERED = 2;
+
+    uint8 private _status;
+
+    struct NFT {
+        address  collection;
+        uint256 id;
+    }
+    
+     //function initialize() public initializer {
+   constructor () { // call setEscrow directly
         owner = msg.sender;
 
-        orders.push(
-            Order(0, address(0), 0, 0, address(0), address(0), 0, "", "", "")
-        );
+         orders.push(Order(        
+                    0,
+                    address(0),
+                    0,
+                    0,
+                    address(0),
+                    address(0),
+                    0, "","",""));
+         _status = _NOT_ENTERED;
+
     }
 
-    function setowner(address _newEscrow) public onlyOwner {
-        escrow = _newEscrow;
-    }
+    modifier nonReentrant() { // from abstract contract ReentrancyGuard 
+        // On the first call to nonReentrant, _notEntered will be true
+        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
 
-    function setEscrow(address _newEscrow) public onlyOwner {
-        escrow = _newEscrow;
-    }
+        // Any calls to nonReentrant after this point will fail
+        _status = _ENTERED;
 
-    function setNativeCoin(address _coin) public onlyOwner {
-        nativecoin = _coin;
+        _;
+
+        // By storing the original value once again, a refund is triggered (see
+        // https://eips.ethereum.org/EIPS/eip-2200)
+        _status = _NOT_ENTERED;
     }
 
-    modifier onlyEscrow() {
-        require(msg.sender == escrow, "Only escrow can");
+    modifier onlyEscrow () {
+        require(isEscrow [msg.sender] , "Only escrow can");
         _;
     }
 
-    modifier onlyOwner() {
+    modifier onlyOwner () {
         require(msg.sender == owner, "Only owner can");
         _;
     }
 
     /**
-     * Make bids (orders) to sell NFTs
-     */
+    * Make bids (orders) to sell NFTs 
+    */
 
-    receive() external payable {
-        revert(
-            "Can't accept payment without collection and IDs, use dApp to send"
-        );
+     
+    receive  () external payable  {
+     //   revert ("Can't accept payment without collection and IDs, use dApp to send");
     }
+    fallback () external payable {
+        revert ("No such function");
+    } 
 
-    fallback() external payable {
-        revert("No such function");
-    }
+    event AddedAsk (uint256 _price, 
+                    address  _currencyCode, 
+                    address _idCollection, 
+                    uint256 _idNFT,
+                    uint256 orderId
+                  );
+    event EditedAsk (uint256 _price, 
+                    address  _currencyCode, 
+                    address _idCollection, 
+                    uint256 _idNFT,
+                    uint8  _active,
+                    uint orderId);
 
-    event AddedAsk(
-        uint256 _price,
-        address _currencyCode,
-        address _idCollection,
-        uint256 _idNFT,
-        uint256 orderId
-    );
-    event EditedAsk(
-        uint256 _price,
-        address _currencyCode,
-        address _idCollection,
-        uint256 _idNFT,
-        uint8 _active,
-        uint256 orderId
-    );
+    event  CanceledAsk (address _idCollection, 
+                        uint256 _idNFT, 
+                        uint orderId
+                        );
+
+    event DepositedKSM (uint256 _amount,  address _sender);
+
+    event BoughtNFT4KSM (address _idCollection, uint256 _idNFT, uint orderID, uint orderPrice );
+
+    event BoughtNFT (address _idCollection, uint256 _idNFT, uint orderID, uint orderPrice );
+
+    event WithdrawnAllKSM (address _sender, uint256 balance); 
 
-    event CanceledAsk(address _idCollection, uint256 _idNFT, uint256 orderId);
+    event WithdrawnKSM (address _sender, uint256 balance); 
 
-    event DepositedKSM(uint256 _amount, address _sender);
+    event Withdrawn (uint256 _amount, address _currencyCode, address _sender);
+    
 
-    event BoughtNFT4KSM(
-        address _idCollection,
-        uint256 _idNFT,
-        uint256 orderID,
-        uint256 orderPrice
-    );
+   function setOwner  (address _newOwner) public onlyOwner {
+        owner = _newOwner;
+    }
 
-    event BoughtNFT(
-        address _idCollection,
-        uint256 _idNFT,
-        uint256 orderID,
-        uint256 orderPrice
-    );
+    function setEscrow  (address _escrow, bool _state) public onlyOwner returns (bool) {
+        if (isEscrow[_escrow] != _state)  {
+            isEscrow[_escrow] = _state;
+            return true;
+        }
+        return false;
+    }
 
-    event WithdrawnAllKSM(address _sender, uint256 balance);
+    function setNativeCoin  (address _coin) public onlyOwner {
+        nativecoin = _coin;
+    }
 
-    event Withdrawn(uint256 _amount, address _currencyCode, address _sender);
 
-    function addAsk(
-        uint256 _price,
-        address _currencyCode,
-        address _idCollection,
-        uint256 _idNFT
-    ) public {
-        //
+    function addAsk (uint256 _price, 
+                    address  _currencyCode, 
+                    address _idCollection, 
+                    uint256 _idNFT
+                  ) public  { //
         address ownerNFT = UniqueNFT(_idCollection).ownerOf(_idNFT);
-        require(ownerNFT == msg.sender, "Only token owner can make ask");
+        require (ownerNFT == msg.sender, "Only token owner can make ask");
         string memory nameNFT;
         string memory symbolNFT;
         string memory uriNFT;
         try UniqueNFT(_idCollection).name() returns (string memory name_) {
             nameNFT = name_;
-        } catch {
-            nameNFT = "";
         }
+        catch {
+            nameNFT="";
+        }   
         try UniqueNFT(_idCollection).symbol() returns (string memory symbol_) {
             symbolNFT = symbol_;
-        } catch {
-            symbolNFT = "";
         }
-        try UniqueNFT(_idCollection).tokenURI(_idNFT) returns (
-            string memory uri_
-        ) {
+        catch {
+            symbolNFT="";
+        }  
+        try UniqueNFT(_idCollection).tokenURI(_idNFT) returns (string memory uri_) {
             uriNFT = uri_;
-        } catch {
-            uriNFT = "";
         }
-        orders.push(
-            Order(
-                _idNFT,
-                _currencyCode,
-                _price,
-                block.timestamp,
-                _idCollection,
-                msg.sender,
-                1, // 1 = is active
-                nameNFT,
-                symbolNFT,
-                uriNFT
-            )
-        );
+        catch {
+            uriNFT="";
+        }        
+        orders.push(Order(        
+                    _idNFT,
+                    _currencyCode,
+                    _price,
+                    block.timestamp,
+                    _idCollection,
+                    msg.sender,
+                    1, // 1 = is active
+                    nameNFT, 
+                    symbolNFT,
+                    uriNFT
+             ));
+            
+            uint orderId = orders.length-1;
+            asks[_idCollection][_idNFT] = orderId;
+            asksbySeller[msg.sender].push(orderId);
+            UniqueNFT(_idCollection).transferFrom(msg.sender, address(this), _idNFT);
+            emit AddedAsk(_price, _currencyCode, _idCollection, _idNFT, orderId);     
+    }
 
-        uint256 orderId = orders.length - 1;
-        asks[_idCollection][_idNFT] = orderId;
-        asksbySeller[msg.sender].push(orderId);
-        UniqueNFT(_idCollection).transferFrom(
-            msg.sender,
-            address(this),
-            _idNFT
-        );
-        emit AddedAsk(_price, _currencyCode, _idCollection, _idNFT, orderId);
-    }
+    function editAsk (uint256 _price, 
+                    address  _currencyCode, 
+                    address _idCollection, 
+                    uint256 _idNFT,
+                    uint8  _active) public {
+        
 
-    function editAsk(
-        uint256 _price,
-        address _currencyCode,
-        address _idCollection,
-        uint256 _idNFT,
-        uint8 _active
-    ) public {
-        uint256 orderID = asks[_idCollection][_idNFT];
+        uint orderID =  asks[_idCollection][_idNFT];
 
-        require(
-            orders[orderID].ownerAddr == msg.sender,
-            "Only token owner can edit ask"
-        );
-        require(orders[orderID].flagActive != 0, "This ask is closed");
-        if (_price > 0) {
-            orders[orderID].price = _price;
+        require (orders[orderID].ownerAddr == msg.sender, "Only token owner can edit ask");
+        require (orders[orderID].flagActive != 0, "This ask is closed");
+        if (_price> 0 ) {
+            orders[orderID].price = _price ;  
         }
-
-        if (_currencyCode != address(0)) {
-            orders[orderID].currencyCode = _currencyCode;
+        
+        if (_currencyCode != address(0) ) {
+            orders[orderID].currencyCode = _currencyCode ;  
         }
 
         orders[orderID].time = block.timestamp;
         orders[orderID].flagActive = _active;
+        
+        emit EditedAsk(_price, _currencyCode, _idCollection, _idNFT, _active, orderID);
+        }
+        
 
-        emit EditedAsk(
-            _price,
-            _currencyCode,
-            _idCollection,
-            _idNFT,
-            _active,
-            orderID
-        );
-    }
+    function cancelAsk (address _idCollection, 
+                        uint256 _idNFT
+                        ) public {
 
-    function cancelAsk(address _idCollection, uint256 _idNFT) public {
-        uint256 orderID = asks[_idCollection][_idNFT];
+        uint orderID =  asks[_idCollection][_idNFT];
 
-        require(
-            orders[orderID].ownerAddr == msg.sender,
-            "Only token owner can edit ask"
-        );
-        require(orders[orderID].flagActive != 0, "This ask is closed");
+        require (orders[orderID].ownerAddr == msg.sender, "Only token owner can edit ask");
+        require (orders[orderID].flagActive != 0, "This ask is closed");
 
         orders[orderID].time = block.timestamp;
         orders[orderID].flagActive = 0;
-        UniqueNFT(_idCollection).transferFrom(
-            address(this),
-            orders[orderID].ownerAddr,
-            _idNFT
-        );
+        UniqueNFT(_idCollection).transferFrom(address(this),orders[orderID].ownerAddr, _idNFT);
         emit CanceledAsk(_idCollection, _idNFT, orderID);
-    }
+        }
+
 
-    function depositKSM(uint256 _amount, address _sender) public onlyEscrow {
+    function depositKSM (uint256 _amount,  address _sender) public onlyEscrow {
         balanceKSM[_sender] = balanceKSM[_sender] + _amount;
         emit DepositedKSM(_amount, _sender);
     }
 
-    function buyKSM(
-        address _idCollection,
-        uint256 _idNFT,
-        address _buyer,
-        address _receiver
-    ) public {
-        Order memory order = orders[asks[_idCollection][_idNFT]];
-        require(msg.sender == escrow || msg.sender == _buyer, "Only escrow or buyer can call buyKSM" );
+    function buyKSM (address _idCollection, uint256 _idNFT, address _buyer, address _receiver ) public {
+        
+        Order memory order = orders[ asks[_idCollection][_idNFT]];
+        require(isEscrow[msg.sender]  || msg.sender == _buyer, "Only escrow or buyer can call buyKSM" );
         //1. reduce balance
+
         balanceKSM[_buyer] = balanceKSM[_buyer] - order.price;
         balanceKSM[order.ownerAddr] = balanceKSM[order.ownerAddr] + order.price;
         // 2. close order
-        orders[asks[_idCollection][_idNFT]].flagActive = 0;
+        orders[ asks[_idCollection][_idNFT]].flagActive = 0;
         // 3. transfer NFT to buyer
         UniqueNFT(_idCollection).transferFrom(address(this), _receiver, _idNFT);
-        emit BoughtNFT4KSM(
-            _idCollection,
-            _idNFT,
-            asks[_idCollection][_idNFT],
-            order.price
-        );
+        emit BoughtNFT4KSM(_idCollection, _idNFT, asks[_idCollection][_idNFT], order.price);
+
     }
-
-    function buy(address _idCollection, uint256 _idNFT)
-        public
-        payable
-        returns (bool result)
-    {
-        //buing for UNQ like as ethers
-
-        Order memory order = orders[asks[_idCollection][_idNFT]];
+    function buy (address _idCollection, uint256 _idNFT ) public payable returns (bool result) { //buing for UNQ like as ethers 
+        
+        Order memory order = orders[asks[_idCollection][_idNFT]]; 
         //1. check sent amount and send to seller
-        require(
-            msg.value == order.price,
-            "Not right amount sent, have to be equal price"
-        );
+        require (msg.value == order.price, "Not right amount sent, have to be equal price" );     
         // 2. close order
-        orders[asks[_idCollection][_idNFT]].flagActive = 0;
-
+        orders[ asks[_idCollection][_idNFT]].flagActive = 0;
+        
         // 3. transfer NFT to buyer
-        UniqueNFT(_idCollection).transferFrom(
-            address(this),
-            msg.sender,
-            _idNFT
-        );
+        UniqueNFT(_idCollection).transferFrom(address(this), msg.sender, _idNFT);
         //uint balance  = address(this).balance;
-        result = payable(order.ownerAddr).send(order.price);
-        emit BoughtNFT(
-            _idCollection,
-            _idNFT,
-            asks[_idCollection][_idNFT],
-            order.price
-        );
+        result = payable(order.ownerAddr).send (order.price); 
+        emit BoughtNFT(_idCollection, _idNFT, asks[_idCollection][_idNFT], order.price);
+        
     }
 
-    /*
-        function buyOther (address _idCollection, uint256 _idNFT, address _currencyCode, uint _amount ) public  { //buy for sny token if seller wants
+/* 
+    function buyOther (address _idCollection, uint256 _idNFT, address _currencyCode, uint _amount ) public  { //buy for sny token if seller wants
+        
+        Order memory order = orders[ asks[_idCollection][_idNFT]];
+        //1. check sent amount and transfer from buyer to seller
+        require (order.price == _amount && order.currencyCode == _currencyCode, "Not right amount or currency sent, have to be equal currency and price" );
+        // !!! transfer have to be approved to marketplace!
+        UniqueFungible(order.currencyCode).transferFrom(msg.sender, address(this), order.price); //to not disclojure buyer's address 
+        UniqueFungible(order.currencyCode).transfer(order.ownerAddr, order.price);
+        // 2. close order
+        orders[ asks[_idCollection][_idNFT]].flagActive = 0;
+        // 3. transfer NFT to buyer
+        UniqueNFT(_idCollection).transferFrom(address(this), msg.sender, _idNFT);
 
-            Order memory order = orders[ asks[_idCollection][_idNFT]];
-            //1. check sent amount and transfer from buyer to seller
-            require (order.price == _amount && order.currencyCode == _currencyCode, "Not right amount or currency sent, have to be equal currency and price" );
-            // !!! transfer have to be approved to marketplace!
-            IERC20(order.currencyCode).transferFrom(msg.sender, address(this), order.price); //to not disclojure buyer's address
-            IERC20(order.currencyCode).transfer(order.ownerAddr, order.price);
-            // 2. close order
-            orders[ asks[_idCollection][_idNFT]].flagActive = 0;
-            // 3. transfer NFT to buyer
-            IERC721ext(_idCollection).transferFrom(address(this), msg.sender, _idNFT);
 
+    }
+ */
 
-        }
-    */
+    function withdrawAllKSM (address _sender) public  nonReentrant returns (uint lastBalance ){
+        require(isEscrow[msg.sender]  || msg.sender == _sender, "Only escrow or balance owner can withdraw all KSM" );
 
-    function withdrawAllKSM(address _sender)
-        public
-        onlyEscrow
-        returns (uint256 lastBalance)
-    {
         lastBalance = balanceKSM[_sender];
-        balanceKSM[_sender] = 0;
+        balanceKSM[_sender] =0;
         emit WithdrawnAllKSM(_sender, lastBalance);
     }
 
-    function withdraw(
-        uint256 _amount,
-        address _currencyCode,
-        address payable _sender
-    ) public onlyOwner returns (bool result) {
-        if (_currencyCode != nativecoin) {
-            //erc20 compat. tokens on UNIQUE chain
-            // uint balance = IERC20(_currencyCode).balanceOf(address(this));
+    function withdrawKSM (uint _amount, address _sender) onlyEscrow public {
+        balanceKSM[_sender] = balanceKSM[_sender] - _amount;
+        emit WithdrawnKSM(_sender, balanceKSM[_sender]);
+        
+    }
+
+    function withdraw (uint256 _amount, address _currencyCode) public  nonReentrant returns (bool result ){ //onlyOwner
+        address payable _sender = payable( msg.sender);
+        if (_currencyCode != nativecoin ) { //erc20 compat. tokens on UNIQUE chain
+            // uint balance = UniqueFungible(_currencyCode).balanceOf(address(this));
             UniqueFungible(_currencyCode).transfer(_sender, _amount);
         } else {
             // uint balance  = address(this).balance;
 
-            result = (_sender).send(_amount); // for UNQ like as ethers
+            result =  (_sender).send(_amount); // for UNQ like as ethers 
         }
         emit Withdrawn(_amount, _currencyCode, _sender);
         return result;
+
     }
 
-    // event GettedOrder(uint , Order);
-    function getOrder(address _idCollection, uint256 _idNFT)
-        public
-        view
-        returns (Order memory)
-    {
-        uint256 orderId = asks[_idCollection][_idNFT];
+    
+   // event GettedOrder(uint , Order);
+    function getOrder (address _idCollection, uint256 _idNFT) public view returns (Order memory) {
+        uint orderId = asks[_idCollection][_idNFT];
         Order memory order = orders[orderId];
-        //       emit GettedOrder (orderId, order);
+ //       emit GettedOrder (orderId, order);
         return order;
     }
 
-    function getOrdersLen() public view returns (uint256) {
+    function getOrdersLen () public view returns (uint) {
         return orders.length;
     }
+
+    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) public pure returns(bytes4) {
+            return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));
+        }
+     
+    //TODO make destructing function to return all 
+    function terminate(address[] calldata tokens, NFT[] calldata nfts) public onlyOwner {
+    // Transfer tokens to owner (TODO: error handling)
+        for (uint i = 0; i < tokens.length; i++) {
+            address addr = tokens[i];
+            UniqueFungible token = UniqueFungible(addr);
+            uint256 balance = token.balanceOf(address(this));
+            token.transfer(owner, balance);
+        }
+        for (uint i = 0; i < nfts.length; i++) {
+            address addr = nfts[i].collection;
+            UniqueNFT token = UniqueNFT(addr);
+            token.transferFrom(address(this), owner, nfts[i].id);
+        }    
+    // Transfer Eth to owner and terminate contract
+        address payable owner1 = payable (owner);
+        uint balance = address(this).balance;
+        owner1.transfer(balance);
+        
+    } 
+    
 }
modifiedtests/src/eth/marketplace/marketplace.test.tsdiffbeforeafterboth
--- a/tests/src/eth/marketplace/marketplace.test.ts
+++ b/tests/src/eth/marketplace/marketplace.test.ts
@@ -46,13 +46,8 @@
   });
 
   itEth('With UNQ', async ({helper}) => {
-    const web3 = helper.getWeb3();
     const matcherOwner = await helper.eth.createAccountWithBalance(donor);
-    const matcherContract = new web3.eth.Contract(JSON.parse((await readFile(`${__dirname}/MarketPlace.abi`)).toString()), undefined, {
-      from: matcherOwner,
-      gas: helper.eth.DEFAULT_GAS,
-    });
-    const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments:[matcherOwner]}).send({from: matcherOwner});
+    const matcher = await helper.ethContract.deployByCode(matcherOwner, 'MarketPlace', (await readFile(`${__dirname}/MarketPlace.sol`)).toString(), [{solPath: 'api/UniqueNFT.sol', fsPath: `${__dirname}/../api/UniqueNFT.sol`}], helper.eth.DEFAULT_GAS * 2);
 
     const sponsor = await helper.eth.createAccountWithBalance(donor);
     const helpers = helper.ethNativeContract.contractHelpers(matcherOwner);
@@ -103,17 +98,12 @@
   });
 
   itEth('With escrow', async ({helper}) => {
-    const web3 = helper.getWeb3();
     const matcherOwner = await helper.eth.createAccountWithBalance(donor);
-    const matcherContract = new web3.eth.Contract(JSON.parse((await readFile(`${__dirname}/MarketPlace.abi`)).toString()), undefined, {
-      from: matcherOwner,
-      gas: helper.eth.DEFAULT_GAS,
-    });
-    const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments: [matcherOwner]}).send({from: matcherOwner, gas: 10000000});
+    const matcher = await helper.ethContract.deployByCode(matcherOwner, 'MarketPlace', (await readFile(`${__dirname}/MarketPlace.sol`)).toString(), [{solPath: 'api/UniqueNFT.sol', fsPath: `${__dirname}/../api/UniqueNFT.sol`}], helper.eth.DEFAULT_GAS * 2);
 
     const sponsor = await helper.eth.createAccountWithBalance(donor);
     const escrow = await helper.eth.createAccountWithBalance(donor);
-    await matcher.methods.setEscrow(escrow).send({from: matcherOwner});
+    await matcher.methods.setEscrow(escrow, true).send({from: matcherOwner});
     const helpers = helper.ethNativeContract.contractHelpers(matcherOwner);
     await helpers.methods.setSponsoringMode(matcher.options.address, SponsoringMode.Allowlisted).send({from: matcherOwner});
     await helpers.methods.setSponsoringRateLimit(matcher.options.address, 1).send({from: matcherOwner});
@@ -172,13 +162,8 @@
   });
 
   itEth('Sell tokens from substrate user via EVM contract', async ({helper}) => {
-    const web3 = helper.getWeb3();
     const matcherOwner = await helper.eth.createAccountWithBalance(donor);
-    const matcherContract = new web3.eth.Contract(JSON.parse((await readFile(`${__dirname}/MarketPlace.abi`)).toString()), undefined, {
-      from: matcherOwner,
-      gas: helper.eth.DEFAULT_GAS,
-    });
-    const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments:[matcherOwner]}).send({from: matcherOwner});
+    const matcher = await helper.ethContract.deployByCode(matcherOwner, 'MarketPlace', (await readFile(`${__dirname}/MarketPlace.sol`)).toString(), [{solPath: 'api/UniqueNFT.sol', fsPath: `${__dirname}/../api/UniqueNFT.sol`}], helper.eth.DEFAULT_GAS * 2);
 
     await helper.eth.transferBalanceFromSubstrate(donor, matcher.options.address);
 
modifiedtests/src/eth/util/playgrounds/unique.dev.tsdiffbeforeafterboth
--- a/tests/src/eth/util/playgrounds/unique.dev.ts
+++ b/tests/src/eth/util/playgrounds/unique.dev.ts
@@ -79,17 +79,17 @@
     };
   }
 
-  async deployByCode(signer: string, name: string, src: string, imports?: ContractImports[]): Promise<Contract> {
+  async deployByCode(signer: string, name: string, src: string, imports?: ContractImports[], gas?: number): Promise<Contract> {
     const compiledContract = await this.compile(name, src, imports);
-    return this.deployByAbi(signer, compiledContract.abi, compiledContract.object);
+    return this.deployByAbi(signer, compiledContract.abi, compiledContract.object, gas);
   }
 
-  async deployByAbi(signer: string, abi: any, object: string): Promise<Contract> {
+  async deployByAbi(signer: string, abi: any, object: string, gas?: number): Promise<Contract> {
     const web3 = this.helper.getWeb3();
     const contract = new web3.eth.Contract(abi, undefined, {
       data: object,
       from: signer,
-      gas: this.helper.eth.DEFAULT_GAS,
+      gas: gas ?? this.helper.eth.DEFAULT_GAS,
     });
     return await contract.deploy({data: object}).send({from: signer});
   }