difftreelog
MarketPlace.sol from unique-marketplace
in: master
5 files changed
tests/src/eth/marketplace/MarketPlace.abidiffbeforeafterbothno changes
tests/src/eth/marketplace/MarketPlace.bindiffbeforeafterboth--- a/tests/src/eth/marketplace/MarketPlace.bin
+++ /dev/null
@@ -1 +0,0 @@
-60806040523480156200001157600080fd5b50604051620029b8380380620029b8833981016040819052620000349162000327565b600580546001600160a01b038084166001600160a01b03199283161790925560068054821633179055604080516101408101825260008082526020808301828152838501838152606085018481526080860185815260a0870186815260c0880187815289518088018b5288815260e08a019081528a518089018c528981526101008b01528a51808901909b52888b526101208a019a909a528754600181018955978052885160099098027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810198895595517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56487018054918e16918d1691909117905593517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56586015591517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e566850155517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56784018054918b16919099161790975595517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56882018054975160ff16600160a01b026001600160a81b0319909816919098161795909517909555915180519194929362000239937f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5699091019291019062000281565b5061010082015180516200025891600784019160209091019062000281565b5061012082015180516200027791600884019160209091019062000281565b5050505062000396565b8280546200028f9062000359565b90600052602060002090601f016020900481019282620002b35760008555620002fe565b82601f10620002ce57805160ff1916838001178555620002fe565b82800160010185558215620002fe579182015b82811115620002fe578251825591602001919060010190620002e1565b506200030c92915062000310565b5090565b5b808211156200030c576000815560010162000311565b6000602082840312156200033a57600080fd5b81516001600160a01b03811681146200035257600080fd5b9392505050565b600181811c908216806200036e57607f821691505b602082108114156200039057634e487b7160e01b600052602260045260246000fd5b50919050565b61261280620003a66000396000f3fe6080604052600436106101025760003560e01c806399f2d4eb11610095578063c10c354611610064578063c10c354614610221578063cce7ec1314610378578063e22d4f7d1461038b578063edb25841146103c3578063fd8868c7146103f057610184565b806399f2d4eb146102c5578063a85c38ef146102e5578063b460af941461031b578063b4c3e8ea1461034b57610184565b80636b084b25116100d15780636b084b2514610241578063791bd866146102615780638c088f001461028157806393cdd334146102a557610184565b806337c4eb58146101bf5780633ce61756146101e157806340b8074614610201578063592bd7051461022157610184565b366101845760405162461bcd60e51b815260206004820152604160248201527f43616e277420616363657074207061796d656e7420776974686f757420636f6c60448201527f6c656374696f6e20616e64204944732c20757365206441707020746f2073656e6064820152601960fa1b608482015260a4015b60405180910390fd5b60405162461bcd60e51b815260206004820152601060248201526f27379039bab1b410333ab731ba34b7b760811b604482015260640161017b565b3480156101cb57600080fd5b506101df6101da366004612054565b610410565b005b3480156101ed57600080fd5b506101df6101fc36600461209c565b610979565b34801561020d57600080fd5b506101df61021c3660046120c0565b6109c5565b34801561022d57600080fd5b506101df61023c36600461209c565b610c27565b34801561024d57600080fd5b506101df61025c3660046120ec565b610c73565b34801561026d57600080fd5b506101df61027c366004612151565b610ee6565b34801561028d57600080fd5b506000545b6040519081526020015b60405180910390f35b3480156102b157600080fd5b506102926102c036600461209c565b610fb1565b3480156102d157600080fd5b506102926102e03660046120c0565b61105e565b3480156102f157600080fd5b50610305610300366004612181565b61108f565b60405161029c9a999897969594939291906121f6565b34801561032757600080fd5b5061033b610336366004612283565b6112a0565b604051901515815260200161029c565b34801561035757600080fd5b5061029261036636600461209c565b60026020526000908152604090205481565b61033b6103863660046120c0565b6113d2565b34801561039757600080fd5b506102926103a63660046120c0565b600360209081526000928352604080842090915290825290205481565b3480156103cf57600080fd5b506103e36103de3660046120c0565b61181b565b60405161029c91906122c5565b3480156103fc57600080fd5b506101df61040b3660046123a5565b611b0c565b6040516331a9108f60e11b8152600481018290526000906001600160a01b03841690636352211e90602401602060405180830381865afa158015610458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047c91906123f8565b90506001600160a01b03811633146104d65760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c7920746f6b656e206f776e65722063616e206d616b652061736b000000604482015260640161017b565b6060806060856001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa92505050801561053a57506040513d6000823e601f3d908101601f19168201604052610537919081019061242b565b60015b61055557604051806020016040528060008152509250610558565b92505b856001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa9250505080156105b757506040513d6000823e601f3d908101601f191682016040526105b4919081019061242b565b60015b6105d2576040518060200160405280600081525091506105d5565b91505b60405163c87b56dd60e01b8152600481018690526001600160a01b0387169063c87b56dd90602401600060405180830381865afa92505050801561063b57506040513d6000823e601f3d908101601f19168201604052610638919081019061242b565b60015b6106545750604080516020810190915260008152610657565b90505b60408051610140810182528681526001600160a01b03808a1660208084019182529383018c815242606085019081528b8416608086019081523360a08701908152600160c0880181815260e089018d81526101008a018d90526101208a018c90526000805493840181558052895160099093027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563810193845597517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56489018054918b166001600160a01b031992831617905596517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56589015594517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56688015592517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e567870180549189169190961617909455517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56885018054925160ff16600160a01b026001600160a81b03199093169190961617179093559151805193949293610828937f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e569909301929190910190611fa3565b506101008201518051610845916007840191602090910190611fa3565b506101208201518051610862916008840191602090910190611fa3565b505060008054909150610877906001906124ee565b6001600160a01b03881660008181526003602090815260408083208b84528252808320859055338084526004808452828520805460018101825590865293909420909201859055516323b872dd60e01b815293945091926323b872dd926108e492909130918c9101612505565b600060405180830381600087803b1580156108fe57600080fd5b505af1158015610912573d6000803e3d6000fd5b5050604080518c81526001600160a01b038c811660208301528b1681830152606081018a90526080810185905290517f83b3a8754d705365b581ab63c329c1e55255a22aa78c67b5fcef378bfb2d9b9993509081900360a0019150a1505050505050505050565b6006546001600160a01b031633146109a35760405162461bcd60e51b815260040161017b90612529565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166000908152600360209081526040808320848452909152812054815490913391839081106109ff576109ff612551565b60009182526020909120600560099092020101546001600160a01b031614610a695760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c7920746f6b656e206f776e65722063616e20656469742061736b000000604482015260640161017b565b60008181548110610a7c57610a7c612551565b6000918252602090912060099091020160050154600160a01b900460ff16610adb5760405162461bcd60e51b8152602060048201526012602482015271151a1a5cc8185cdac81a5cc818db1bdcd95960721b604482015260640161017b565b4260008281548110610aef57610aef612551565b9060005260206000209060090201600301819055506000808281548110610b1857610b18612551565b906000526020600020906009020160050160146101000a81548160ff021916908360ff160217905550826001600160a01b03166323b872dd3060008481548110610b6457610b64612551565b60009182526020909120600560099092020101546040516001600160e01b031960e085901b168152610ba592916001600160a01b0316908790600401612505565b600060405180830381600087803b158015610bbf57600080fd5b505af1158015610bd3573d6000803e3d6000fd5b5050604080516001600160a01b0387168152602081018690529081018490527f6330f58b476cc7f9dd8db8130a0fbb49b291ebc32531eb36e9646f56ee20174b9250606001905060405180910390a1505050565b6006546001600160a01b03163314610c515760405162461bcd60e51b815260040161017b90612529565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316600090815260036020908152604080832085845290915281205481549091339183908110610cad57610cad612551565b60009182526020909120600560099092020101546001600160a01b031614610d175760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c7920746f6b656e206f776e65722063616e20656469742061736b000000604482015260640161017b565b60008181548110610d2a57610d2a612551565b6000918252602090912060099091020160050154600160a01b900460ff16610d895760405162461bcd60e51b8152602060048201526012602482015271151a1a5cc8185cdac81a5cc818db1bdcd95960721b604482015260640161017b565b8515610db9578560008281548110610da357610da3612551565b9060005260206000209060090201600201819055505b6001600160a01b03851615610e12578460008281548110610ddc57610ddc612551565b906000526020600020906009020160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b4260008281548110610e2657610e26612551565b9060005260206000209060090201600301819055508160008281548110610e4f57610e4f612551565b600091825260209182902060099190910201600501805460ff60a01b1916600160a01b60ff94851602179055604080518981526001600160a01b03898116938201939093529187169082015260608101859052908316608082015260a081018290527f04211d838289b72af597bf28a4ccff5a30d6056f5fce2eddb127ab4ffea0963d9060c00160405180910390a1505050505050565b6005546001600160a01b03163314610f325760405162461bcd60e51b815260206004820152600f60248201526e27b7363c9032b9b1b937bb9031b0b760891b604482015260640161017b565b6001600160a01b038116600090815260026020526040902054610f56908390612567565b6001600160a01b038216600081815260026020908152604091829020939093558051858152928301919091527f291ce0b690061cb1b3f1111bf6500efe526983251fb0f863251ec3670d035fc4910160405180910390a15050565b6005546000906001600160a01b031633146110005760405162461bcd60e51b815260206004820152600f60248201526e27b7363c9032b9b1b937bb9031b0b760891b604482015260640161017b565b506001600160a01b03811660008181526002602090815260408083208054939055805193845290830182905290917f027aeacbc6fbfa7fe735ff8f14a600469ad1a3197ce1c8c8a159641cf68fe592910160405180910390a1919050565b6004602052816000526040600020818154811061107a57600080fd5b90600052602060002001600091509150505481565b6000818154811061109f57600080fd5b600091825260209091206009909102018054600182015460028301546003840154600485015460058601546006870180549698506001600160a01b0395861697949693959283169492821693600160a01b90920460ff1692916111019061257f565b80601f016020809104026020016040519081016040528092919081815260200182805461112d9061257f565b801561117a5780601f1061114f5761010080835404028352916020019161117a565b820191906000526020600020905b81548152906001019060200180831161115d57829003601f168201915b50505050509080600701805461118f9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb9061257f565b80156112085780601f106111dd57610100808354040283529160200191611208565b820191906000526020600020905b8154815290600101906020018083116111eb57829003601f168201915b50505050509080600801805461121d9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546112499061257f565b80156112965780601f1061126b57610100808354040283529160200191611296565b820191906000526020600020905b81548152906001019060200180831161127957829003601f168201915b505050505090508a565b6006546000906001600160a01b031633146112cd5760405162461bcd60e51b815260040161017b90612529565b6007546001600160a01b0384811691161461135b5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820186905284169063a9059cbb906044016020604051808303816000875af1158015611331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135591906125ba565b50611382565b6040516001600160a01b0383169085156108fc029086906000818181858888f19450505050505b604080518581526001600160a01b03858116602083015284168183015290517fb524bace85e4ce0f8da306e32f39263c5724780ca00b7551c051c8e3dc36adaf9181900360600190a19392505050565b6001600160a01b0382166000908152600360209081526040808320848452909152812054815482918291811061140a5761140a612551565b600091825260209182902060408051610140810182526009939093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015483166080830152600581015492831660a0830152600160a01b90920460ff1660c082015260068201805491929160e08401919061149b9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546114c79061257f565b80156115145780601f106114e957610100808354040283529160200191611514565b820191906000526020600020905b8154815290600101906020018083116114f757829003601f168201915b5050505050815260200160078201805461152d9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546115599061257f565b80156115a65780601f1061157b576101008083540402835291602001916115a6565b820191906000526020600020905b81548152906001019060200180831161158957829003601f168201915b505050505081526020016008820180546115bf9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546115eb9061257f565b80156116385780601f1061160d57610100808354040283529160200191611638565b820191906000526020600020905b81548152906001019060200180831161161b57829003601f168201915b5050505050815250509050806040015134146116ac5760405162461bcd60e51b815260206004820152602d60248201527f4e6f7420726967687420616d6f756e742073656e742c206861766520746f206260448201526c6520657175616c20707269636560981b606482015260840161017b565b6001600160a01b0384166000908152600360209081526040808320868452909152812054815482919081106116e3576116e3612551565b906000526020600020906009020160050160146101000a81548160ff021916908360ff160217905550836001600160a01b03166323b872dd3033866040518463ffffffff1660e01b815260040161173c93929190612505565b600060405180830381600087803b15801561175657600080fd5b505af115801561176a573d6000803e3d6000fd5b505050508060a001516001600160a01b03166108fc82604001519081150290604051600060405180830381858888f16001600160a01b03891660008181526003602090815260408083208c8452825291829020548983015183519485529184018c90529183019190915260608201529096507fc220cf2a12d6492e23ed1141c55018997799699d009b00ebd5a4874c60f5c31e9450608001925061180c915050565b60405180910390a15092915050565b61188f6040518061014001604052806000815260200160006001600160a01b03168152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600060ff1681526020016060815260200160608152602001606081525090565b6001600160a01b038316600090815260036020908152604080832085845290915281205481549091908190839081106118ca576118ca612551565b600091825260209182902060408051610140810182526009939093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015483166080830152600581015492831660a0830152600160a01b90920460ff1660c082015260068201805491929160e08401919061195b9061257f565b80601f01602080910402602001604051908101604052809291908181526020018280546119879061257f565b80156119d45780601f106119a9576101008083540402835291602001916119d4565b820191906000526020600020905b8154815290600101906020018083116119b757829003601f168201915b505050505081526020016007820180546119ed9061257f565b80601f0160208091040260200160405190810160405280929190818152602001828054611a199061257f565b8015611a665780601f10611a3b57610100808354040283529160200191611a66565b820191906000526020600020905b815481529060010190602001808311611a4957829003601f168201915b50505050508152602001600882018054611a7f9061257f565b80601f0160208091040260200160405190810160405280929190818152602001828054611aab9061257f565b8015611af85780601f10611acd57610100808354040283529160200191611af8565b820191906000526020600020905b815481529060010190602001808311611adb57829003601f168201915b505050919092525091979650505050505050565b6001600160a01b038416600090815260036020908152604080832086845290915281205481548291908110611b4357611b43612551565b600091825260209182902060408051610140810182526009939093029091018054835260018101546001600160a01b039081169484019490945260028101549183019190915260038101546060830152600481015483166080830152600581015492831660a0830152600160a01b90920460ff1660c082015260068201805491929160e084019190611bd49061257f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c009061257f565b8015611c4d5780601f10611c2257610100808354040283529160200191611c4d565b820191906000526020600020905b815481529060010190602001808311611c3057829003601f168201915b50505050508152602001600782018054611c669061257f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c929061257f565b8015611cdf5780601f10611cb457610100808354040283529160200191611cdf565b820191906000526020600020905b815481529060010190602001808311611cc257829003601f168201915b50505050508152602001600882018054611cf89061257f565b80601f0160208091040260200160405190810160405280929190818152602001828054611d249061257f565b8015611d715780601f10611d4657610100808354040283529160200191611d71565b820191906000526020600020905b815481529060010190602001808311611d5457829003601f168201915b505050919092525050600554919250506001600160a01b0316331480611d9f5750336001600160a01b038416145b611df75760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920657363726f77206f722062757965722063616e2063616c6c206275604482015263794b534d60e01b606482015260840161017b565b6040808201516001600160a01b038516600090815260026020529190912054611e2091906124ee565b6001600160a01b03808516600090815260026020526040808220939093558383015160a085015190921681529190912054611e5b9190612567565b60a08201516001600160a01b039081166000908152600260209081526040808320949094559188168152600382528281208782529091529081205481548291908110611ea957611ea9612551565b906000526020600020906009020160050160146101000a81548160ff021916908360ff160217905550846001600160a01b03166323b872dd3084876040518463ffffffff1660e01b8152600401611f0293929190612505565b600060405180830381600087803b158015611f1c57600080fd5b505af1158015611f30573d6000803e3d6000fd5b505050506001600160a01b038516600081815260036020908152604080832088845282529182902054848301518351948552918401889052838301526060830152517f68bdd3548f3f05742b376651745ca73472eb18f2230f64b893d7a48e575eb0149181900360800190a15050505050565b828054611faf9061257f565b90600052602060002090601f016020900481019282611fd15760008555612017565b82601f10611fea57805160ff1916838001178555612017565b82800160010185558215612017579182015b82811115612017578251825591602001919060010190611ffc565b50612023929150612027565b5090565b5b808211156120235760008155600101612028565b6001600160a01b038116811461205157600080fd5b50565b6000806000806080858703121561206a57600080fd5b84359350602085013561207c8161203c565b9250604085013561208c8161203c565b9396929550929360600135925050565b6000602082840312156120ae57600080fd5b81356120b98161203c565b9392505050565b600080604083850312156120d357600080fd5b82356120de8161203c565b946020939093013593505050565b600080600080600060a0868803121561210457600080fd5b8535945060208601356121168161203c565b935060408601356121268161203c565b925060608601359150608086013560ff8116811461214357600080fd5b809150509295509295909350565b6000806040838503121561216457600080fd5b8235915060208301356121768161203c565b809150509250929050565b60006020828403121561219357600080fd5b5035919050565b60005b838110156121b557818101518382015260200161219d565b838111156121c4576000848401525b50505050565b600081518084526121e281602086016020860161219a565b601f01601f19169290920160200192915050565b8a81526001600160a01b038a81166020830152604082018a9052606082018990528781166080830152861660a082015260ff851660c082015261014060e08201819052600090612248838201876121ca565b905082810361010084015261225d81866121ca565b905082810361012084015261227281856121ca565b9d9c50505050505050505050505050565b60008060006060848603121561229857600080fd5b8335925060208401356122aa8161203c565b915060408401356122ba8161203c565b809150509250925092565b6020815281516020820152600060208301516122ec60408401826001600160a01b03169052565b506040830151606083015260608301516080830152608083015161231b60a08401826001600160a01b03169052565b5060a08301516001600160a01b03811660c08401525060c083015160ff811660e08401525060e0830151610140610100818186015261235e6101608601846121ca565b9250808601519050601f1961012081878603018188015261237f85846121ca565b90880151878203909201848801529350905061239b83826121ca565b9695505050505050565b600080600080608085870312156123bb57600080fd5b84356123c68161203c565b93506020850135925060408501356123dd8161203c565b915060608501356123ed8161203c565b939692955090935050565b60006020828403121561240a57600080fd5b81516120b98161203c565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561243d57600080fd5b815167ffffffffffffffff8082111561245557600080fd5b818401915084601f83011261246957600080fd5b81518181111561247b5761247b612415565b604051601f8201601f19908116603f011681019083821181831017156124a3576124a3612415565b816040528281528760208487010111156124bc57600080fd5b6124cd83602083016020880161219a565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600082821015612500576125006124d8565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252600e908201526d27b7363c9037bbb732b91031b0b760911b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000821982111561257a5761257a6124d8565b500190565b600181811c9082168061259357607f821691505b602082108114156125b457634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156125cc57600080fd5b815180151581146120b957600080fdfea26469706673582212205a8295bbb792776496ccaaa9cb7384efe95af6490ca8015ceb6eb22e5ab3ae6b64736f6c634300080a0033
\ No newline at end of file
tests/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);
+
+ }
+
}
tests/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);
tests/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});
}