tx · FKqe3qf1n3mNtiFHT4LaB3CPHdcrZJKbfkjXw5QGE2Jg 3PAimVkP7cqar6gMKNh5bQDNH9x4U6sXE7u: -0.01000000 Waves 2022.01.03 19:48 [2928067] smart account 3PAimVkP7cqar6gMKNh5bQDNH9x4U6sXE7u > SELF 0.00000000 Waves
{ "type": 13, "id": "FKqe3qf1n3mNtiFHT4LaB3CPHdcrZJKbfkjXw5QGE2Jg", "fee": 1000000, "feeAssetId": null, "timestamp": 1641228470535, "version": 1, "sender": "3PAimVkP7cqar6gMKNh5bQDNH9x4U6sXE7u", "senderPublicKey": "FZMCzazzRQMocGNfhYr2gvt3qrzyG2Z6FCw1nTDmkDCA", "proofs": [ "H5artYzRvKpmhY3htva66vKd19teTppzuuoRPY9bgkW9TetH1cuF3Pvbo4sQR9QpPWHvg46DL6GzsLxpDUGbCdn" ], "script": "base64:AAIFAAAAAAAAAAsIAhIFCgMIAQgSAAAAAAoBAAAACmtleUFzc2V0SWQAAAABAAAAB2FkZHJlc3MJAAEsAAAAAgIAAAAPJXMlc19fYXNzZXRJZF9fBQAAAAdhZGRyZXNzAQAAAAlrZXlBbW91bnQAAAABAAAAB2FkZHJlc3MJAAEsAAAAAgIAAAAOJXMlc19fYW1vdW50X18FAAAAB2FkZHJlc3MBAAAACmtleVBhcnRuZXIAAAABAAAAB2FkZHJlc3MJAAEsAAAAAgIAAAAPJXMlc19fcGFydG5lcl9fBQAAAAdhZGRyZXNzAQAAABBrZXlXYW50ZWRBc3NldElkAAAAAQAAAAdhZGRyZXNzCQABLAAAAAICAAAAFSVzJXNfX3dhbnRlZEFzc2V0SWRfXwUAAAAHYWRkcmVzcwEAAAAPa2V5V2FudGVkQW1vdW50AAAAAQAAAAdhZGRyZXNzCQABLAAAAAICAAAAFCVzJXNfX3dhbnRlZEFtb3VudF9fBQAAAAdhZGRyZXNzAQAAAAV0b1N0cgAAAAEAAAAHYXNzZXRJZAMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAEdW5pdAIAAAAFV0FWRVMJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQUAAAAHYXNzZXRJZAEAAAAHZnJvbVN0cgAAAAEAAAAKYXNzZXRJZFN0cgMJAAAAAAAAAgUAAAAKYXNzZXRJZFN0cgIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAKYXNzZXRJZFN0cgEAAAASY3Jvc3NDaGVja0Fzc2V0SWRzAAAABQAAAA5wYXJ0bmVyQWRkcmVzcwAAABBteU9mZmVyZWRBc3NldElkAAAAD215V2FudGVkQXNzZXRJZAAAABVwYXJ0bmVyT2ZmZXJlZEFzc2V0SWQAAAAUcGFydG5lcldhbnRlZEFzc2V0SWQDAwkBAAAAAiE9AAAAAgUAAAAVcGFydG5lck9mZmVyZWRBc3NldElkBQAAAA9teVdhbnRlZEFzc2V0SWQGCQEAAAACIT0AAAACBQAAABRwYXJ0bmVyV2FudGVkQXNzZXRJZAUAAAAQbXlPZmZlcmVkQXNzZXRJZAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAAC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cmVzcwUAAAAIbXlBbW91bnQFAAAACndhbnRBbW91bnQJAQAAAAV2YWx1ZQAAAAEJAAQaAAAAAgUAAAAEdGhpcwkBAAAACWtleUFtb3VudAAAAAEFAAAADnBhcnRuZXJBZGRyZXNzCQEAAAAFdmFsdWUAAAABCQAEGgAAAAIFAAAABHRoaXMJAQAAAA9rZXlXYW50ZWRBbW91bnQAAAABBQAAAA5wYXJ0bmVyQWRkcmVzcwcDCQAAAAAAAAIFAAAABWNoZWNrBQAAAAVjaGVjawkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAdwYXJ0bmVyBQAAAAhteUFtb3VudAUAAAAJbXlBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKd2FudEFtb3VudAkBAAAAB2Zyb21TdHIAAAABBQAAAA13YW50ZWRBc3NldElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAprZXlBc3NldElkAAAAAQUAAAAOcGFydG5lckFkZHJlc3MJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAACWtleUFtb3VudAAAAAEFAAAADnBhcnRuZXJBZGRyZXNzCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAprZXlQYXJ0bmVyAAAAAQUAAAAOcGFydG5lckFkZHJlc3MJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAEGtleVdhbnRlZEFzc2V0SWQAAAABBQAAAA5wYXJ0bmVyQWRkcmVzcwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAPa2V5V2FudGVkQW1vdW50AAAAAQUAAAAOcGFydG5lckFkZHJlc3MFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFzc2V0SWQAAAABBQAAAAZjYWxsZXIJAQAAAAV0b1N0cgAAAAEFAAAACW15QXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAACWtleUFtb3VudAAAAAEFAAAABmNhbGxlcgUAAAAIbXlBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleVBhcnRuZXIAAAABBQAAAAZjYWxsZXIFAAAADnBhcnRuZXJBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlXYW50ZWRBc3NldElkAAAAAQUAAAAGY2FsbGVyBQAAAA13YW50ZWRBc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPa2V5V2FudGVkQW1vdW50AAAAAQUAAAAGY2FsbGVyBQAAAAp3YW50QW1vdW50BQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAABmNhbmNlbAAAAAAEAAAABmNhbGxlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAACmFzc2V0SWRLZXkJAQAAAAprZXlBc3NldElkAAAAAQUAAAAGY2FsbGVyBAAAAAphc3NldElkUmF3CQAEHQAAAAIFAAAABHRoaXMFAAAACmFzc2V0SWRLZXkDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABBQAAAAphc3NldElkUmF3CQAAAgAAAAECAAAAHVlvdSBkb24ndCBoYXZlIGFuIGFjdGl2ZSBkZWFsBAAAAAphc3NldElkU3RyCQEAAAAFdmFsdWUAAAABBQAAAAphc3NldElkUmF3CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgkBAAAABXZhbHVlAAAAAQkABBoAAAACBQAAAAR0aGlzCQEAAAAJa2V5QW1vdW50AAAAAQUAAAAGY2FsbGVyCQEAAAAHZnJvbVN0cgAAAAEFAAAACmFzc2V0SWRTdHIJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAKYXNzZXRJZEtleQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAJa2V5QW1vdW50AAAAAQUAAAAGY2FsbGVyCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAprZXlQYXJ0bmVyAAAAAQUAAAAGY2FsbGVyCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABBrZXlXYW50ZWRBc3NldElkAAAAAQUAAAAGY2FsbGVyCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAA9rZXlXYW50ZWRBbW91bnQAAAABBQAAAAZjYWxsZXIFAAAAA25pbAAAAAAWnt4m", "chainId": 87, "height": 2928067, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ANtuEzksYvQhhnYot6hyvSYN9opTA22fF5JHRY8ECZxw Next: 3ze9KYGHVowBhJqDuKhRAqAKrvk3kTjAN7vKd7feEwYe Diff:
Old | New | Differences | |
---|---|---|---|
40 | 40 | else true | |
41 | 41 | ||
42 | 42 | ||
43 | + | func checkAsset (wantAssetId) = { | |
44 | + | let asset = fromStr(wantAssetId) | |
45 | + | let result = if ((asset != unit)) | |
46 | + | then { | |
47 | + | let nfo = assetInfo(value(asset)) | |
48 | + | if ((nfo == unit)) | |
49 | + | then throw("Invalid wantAssetId: assetInfo missing") | |
50 | + | else if ((size(value(nfo).id) != 32)) | |
51 | + | then throw(("Invalid wantAssetId: assetInfo size is " + toString(size(value(nfo).id)))) | |
52 | + | else if ((size(value(nfo).issuer.bytes) != 32)) | |
53 | + | then throw(("Invalid wantAssetId: issuer address is " + toBase58String(value(nfo).issuer.bytes))) | |
54 | + | else true | |
55 | + | } | |
56 | + | else true | |
57 | + | if ((result == result)) | |
58 | + | then toStr(asset) | |
59 | + | else throw("Strict value is not equal to itself.") | |
60 | + | } | |
61 | + | ||
62 | + | ||
43 | 63 | @Callable(i) | |
44 | 64 | func escrow (wantAssetId,wantAmount,partnerAddress) = { | |
45 | 65 | let caller = toString(i.caller) | |
51 | 71 | let partner = addressFromStringValue(partnerAddress) | |
52 | 72 | if ((partner == partner)) | |
53 | 73 | then { | |
54 | - | let wantedAssetId = toStr(fromStr(wantAssetId)) | |
55 | - | if ((wantedAssetId == wantedAssetId)) | |
56 | - | then if ((0 >= wantAmount)) | |
57 | - | then throw("Non-positive wantAmount") | |
58 | - | else { | |
59 | - | let partnerAssetId = getString(this, keyAssetId(partnerAddress)) | |
60 | - | let myAssetId = value(i.payments[0]).assetId | |
61 | - | let myAmount = value(i.payments[0]).amount | |
62 | - | if (isDefined(partnerAssetId)) | |
63 | - | then if ((value(getString(this, keyPartner(partnerAddress))) != caller)) | |
64 | - | then throw(("You are not a partner of " + partnerAddress)) | |
65 | - | else { | |
66 | - | let check = if (crossCheckAssetIds(partnerAddress, toStr(myAssetId), wantedAssetId, value(partnerAssetId), value(getString(this, keyWantedAssetId(partnerAddress))))) | |
67 | - | then crossCheckAmounts(partnerAddress, myAmount, wantAmount, value(getInteger(this, keyAmount(partnerAddress))), value(getInteger(this, keyWantedAmount(partnerAddress)))) | |
68 | - | else false | |
69 | - | if ((check == check)) | |
70 | - | then [ScriptTransfer(partner, myAmount, myAssetId), ScriptTransfer(i.caller, wantAmount, fromStr(wantedAssetId)), DeleteEntry(keyAssetId(partnerAddress)), DeleteEntry(keyAmount(partnerAddress)), DeleteEntry(keyPartner(partnerAddress)), DeleteEntry(keyWantedAssetId(partnerAddress)), DeleteEntry(keyWantedAmount(partnerAddress))] | |
71 | - | else throw("Strict value is not equal to itself.") | |
72 | - | } | |
73 | - | else [StringEntry(keyAssetId(caller), toStr(myAssetId)), IntegerEntry(keyAmount(caller), myAmount), StringEntry(keyPartner(caller), partnerAddress), StringEntry(keyWantedAssetId(caller), wantedAssetId), IntegerEntry(keyWantedAmount(caller), wantAmount)] | |
74 | - | } | |
75 | - | else throw("Strict value is not equal to itself.") | |
74 | + | let wantedAssetId = checkAsset(wantAssetId) | |
75 | + | if ((0 >= wantAmount)) | |
76 | + | then throw("Non-positive wantAmount") | |
77 | + | else { | |
78 | + | let partnerAssetId = getString(this, keyAssetId(partnerAddress)) | |
79 | + | let myAssetId = value(i.payments[0]).assetId | |
80 | + | let myAmount = value(i.payments[0]).amount | |
81 | + | if (isDefined(partnerAssetId)) | |
82 | + | then if ((value(getString(this, keyPartner(partnerAddress))) != caller)) | |
83 | + | then throw(("You are not a partner of " + partnerAddress)) | |
84 | + | else { | |
85 | + | let check = if (crossCheckAssetIds(partnerAddress, toStr(myAssetId), wantedAssetId, value(partnerAssetId), value(getString(this, keyWantedAssetId(partnerAddress))))) | |
86 | + | then crossCheckAmounts(partnerAddress, myAmount, wantAmount, value(getInteger(this, keyAmount(partnerAddress))), value(getInteger(this, keyWantedAmount(partnerAddress)))) | |
87 | + | else false | |
88 | + | if ((check == check)) | |
89 | + | then [ScriptTransfer(partner, myAmount, myAssetId), ScriptTransfer(i.caller, wantAmount, fromStr(wantedAssetId)), DeleteEntry(keyAssetId(partnerAddress)), DeleteEntry(keyAmount(partnerAddress)), DeleteEntry(keyPartner(partnerAddress)), DeleteEntry(keyWantedAssetId(partnerAddress)), DeleteEntry(keyWantedAmount(partnerAddress))] | |
90 | + | else throw("Strict value is not equal to itself.") | |
91 | + | } | |
92 | + | else [StringEntry(keyAssetId(caller), toStr(myAssetId)), IntegerEntry(keyAmount(caller), myAmount), StringEntry(keyPartner(caller), partnerAddress), StringEntry(keyWantedAssetId(caller), wantedAssetId), IntegerEntry(keyWantedAmount(caller), wantAmount)] | |
93 | + | } | |
76 | 94 | } | |
77 | 95 | else throw("Strict value is not equal to itself.") | |
78 | 96 | } |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func keyAssetId (address) = ("%s%s__assetId__" + address) | |
5 | 5 | ||
6 | 6 | ||
7 | 7 | func keyAmount (address) = ("%s%s__amount__" + address) | |
8 | 8 | ||
9 | 9 | ||
10 | 10 | func keyPartner (address) = ("%s%s__partner__" + address) | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | func keyWantedAssetId (address) = ("%s%s__wantedAssetId__" + address) | |
14 | 14 | ||
15 | 15 | ||
16 | 16 | func keyWantedAmount (address) = ("%s%s__wantedAmount__" + address) | |
17 | 17 | ||
18 | 18 | ||
19 | 19 | func toStr (assetId) = if ((assetId == unit)) | |
20 | 20 | then "WAVES" | |
21 | 21 | else toBase58String(value(assetId)) | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | func fromStr (assetIdStr) = if ((assetIdStr == "WAVES")) | |
25 | 25 | then unit | |
26 | 26 | else fromBase58String(assetIdStr) | |
27 | 27 | ||
28 | 28 | ||
29 | 29 | func crossCheckAssetIds (partnerAddress,myOfferedAssetId,myWantedAssetId,partnerOfferedAssetId,partnerWantedAssetId) = if (if ((partnerOfferedAssetId != myWantedAssetId)) | |
30 | 30 | then true | |
31 | 31 | else (partnerWantedAssetId != myOfferedAssetId)) | |
32 | 32 | then throw(((((((((("AssetIds don't match: you want " + myWantedAssetId) + " and pay ") + myOfferedAssetId) + ", but ") + partnerAddress) + " wants ") + partnerWantedAssetId) + " and pays ") + partnerOfferedAssetId)) | |
33 | 33 | else true | |
34 | 34 | ||
35 | 35 | ||
36 | 36 | func crossCheckAmounts (partnerAddress,myOfferedAmount,myWantedAmount,partnerOfferedAmount,partnerWantedAmount) = if (if ((partnerOfferedAmount != myWantedAmount)) | |
37 | 37 | then true | |
38 | 38 | else (partnerWantedAmount != myOfferedAmount)) | |
39 | 39 | then throw(((((((((("Amounts don't match: you want " + toString(myWantedAmount)) + " and pay ") + toString(myOfferedAmount)) + ", but ") + partnerAddress) + " wants ") + toString(partnerWantedAmount)) + " and pays ") + toString(partnerOfferedAmount))) | |
40 | 40 | else true | |
41 | 41 | ||
42 | 42 | ||
43 | + | func checkAsset (wantAssetId) = { | |
44 | + | let asset = fromStr(wantAssetId) | |
45 | + | let result = if ((asset != unit)) | |
46 | + | then { | |
47 | + | let nfo = assetInfo(value(asset)) | |
48 | + | if ((nfo == unit)) | |
49 | + | then throw("Invalid wantAssetId: assetInfo missing") | |
50 | + | else if ((size(value(nfo).id) != 32)) | |
51 | + | then throw(("Invalid wantAssetId: assetInfo size is " + toString(size(value(nfo).id)))) | |
52 | + | else if ((size(value(nfo).issuer.bytes) != 32)) | |
53 | + | then throw(("Invalid wantAssetId: issuer address is " + toBase58String(value(nfo).issuer.bytes))) | |
54 | + | else true | |
55 | + | } | |
56 | + | else true | |
57 | + | if ((result == result)) | |
58 | + | then toStr(asset) | |
59 | + | else throw("Strict value is not equal to itself.") | |
60 | + | } | |
61 | + | ||
62 | + | ||
43 | 63 | @Callable(i) | |
44 | 64 | func escrow (wantAssetId,wantAmount,partnerAddress) = { | |
45 | 65 | let caller = toString(i.caller) | |
46 | 66 | if (isDefined(getString(this, keyAssetId(caller)))) | |
47 | 67 | then throw("You already have an active deal, please cancel it first") | |
48 | 68 | else if ((size(i.payments) != 1)) | |
49 | 69 | then throw("Exactly 1 payment expected") | |
50 | 70 | else { | |
51 | 71 | let partner = addressFromStringValue(partnerAddress) | |
52 | 72 | if ((partner == partner)) | |
53 | 73 | then { | |
54 | - | let wantedAssetId = toStr(fromStr(wantAssetId)) | |
55 | - | if ((wantedAssetId == wantedAssetId)) | |
56 | - | then if ((0 >= wantAmount)) | |
57 | - | then throw("Non-positive wantAmount") | |
58 | - | else { | |
59 | - | let partnerAssetId = getString(this, keyAssetId(partnerAddress)) | |
60 | - | let myAssetId = value(i.payments[0]).assetId | |
61 | - | let myAmount = value(i.payments[0]).amount | |
62 | - | if (isDefined(partnerAssetId)) | |
63 | - | then if ((value(getString(this, keyPartner(partnerAddress))) != caller)) | |
64 | - | then throw(("You are not a partner of " + partnerAddress)) | |
65 | - | else { | |
66 | - | let check = if (crossCheckAssetIds(partnerAddress, toStr(myAssetId), wantedAssetId, value(partnerAssetId), value(getString(this, keyWantedAssetId(partnerAddress))))) | |
67 | - | then crossCheckAmounts(partnerAddress, myAmount, wantAmount, value(getInteger(this, keyAmount(partnerAddress))), value(getInteger(this, keyWantedAmount(partnerAddress)))) | |
68 | - | else false | |
69 | - | if ((check == check)) | |
70 | - | then [ScriptTransfer(partner, myAmount, myAssetId), ScriptTransfer(i.caller, wantAmount, fromStr(wantedAssetId)), DeleteEntry(keyAssetId(partnerAddress)), DeleteEntry(keyAmount(partnerAddress)), DeleteEntry(keyPartner(partnerAddress)), DeleteEntry(keyWantedAssetId(partnerAddress)), DeleteEntry(keyWantedAmount(partnerAddress))] | |
71 | - | else throw("Strict value is not equal to itself.") | |
72 | - | } | |
73 | - | else [StringEntry(keyAssetId(caller), toStr(myAssetId)), IntegerEntry(keyAmount(caller), myAmount), StringEntry(keyPartner(caller), partnerAddress), StringEntry(keyWantedAssetId(caller), wantedAssetId), IntegerEntry(keyWantedAmount(caller), wantAmount)] | |
74 | - | } | |
75 | - | else throw("Strict value is not equal to itself.") | |
74 | + | let wantedAssetId = checkAsset(wantAssetId) | |
75 | + | if ((0 >= wantAmount)) | |
76 | + | then throw("Non-positive wantAmount") | |
77 | + | else { | |
78 | + | let partnerAssetId = getString(this, keyAssetId(partnerAddress)) | |
79 | + | let myAssetId = value(i.payments[0]).assetId | |
80 | + | let myAmount = value(i.payments[0]).amount | |
81 | + | if (isDefined(partnerAssetId)) | |
82 | + | then if ((value(getString(this, keyPartner(partnerAddress))) != caller)) | |
83 | + | then throw(("You are not a partner of " + partnerAddress)) | |
84 | + | else { | |
85 | + | let check = if (crossCheckAssetIds(partnerAddress, toStr(myAssetId), wantedAssetId, value(partnerAssetId), value(getString(this, keyWantedAssetId(partnerAddress))))) | |
86 | + | then crossCheckAmounts(partnerAddress, myAmount, wantAmount, value(getInteger(this, keyAmount(partnerAddress))), value(getInteger(this, keyWantedAmount(partnerAddress)))) | |
87 | + | else false | |
88 | + | if ((check == check)) | |
89 | + | then [ScriptTransfer(partner, myAmount, myAssetId), ScriptTransfer(i.caller, wantAmount, fromStr(wantedAssetId)), DeleteEntry(keyAssetId(partnerAddress)), DeleteEntry(keyAmount(partnerAddress)), DeleteEntry(keyPartner(partnerAddress)), DeleteEntry(keyWantedAssetId(partnerAddress)), DeleteEntry(keyWantedAmount(partnerAddress))] | |
90 | + | else throw("Strict value is not equal to itself.") | |
91 | + | } | |
92 | + | else [StringEntry(keyAssetId(caller), toStr(myAssetId)), IntegerEntry(keyAmount(caller), myAmount), StringEntry(keyPartner(caller), partnerAddress), StringEntry(keyWantedAssetId(caller), wantedAssetId), IntegerEntry(keyWantedAmount(caller), wantAmount)] | |
93 | + | } | |
76 | 94 | } | |
77 | 95 | else throw("Strict value is not equal to itself.") | |
78 | 96 | } | |
79 | 97 | } | |
80 | 98 | ||
81 | 99 | ||
82 | 100 | ||
83 | 101 | @Callable(i) | |
84 | 102 | func cancel () = { | |
85 | 103 | let caller = toString(i.caller) | |
86 | 104 | let assetIdKey = keyAssetId(caller) | |
87 | 105 | let assetIdRaw = getString(this, assetIdKey) | |
88 | 106 | if (!(isDefined(assetIdRaw))) | |
89 | 107 | then throw("You don't have an active deal") | |
90 | 108 | else { | |
91 | 109 | let assetIdStr = value(assetIdRaw) | |
92 | 110 | [ScriptTransfer(i.caller, value(getInteger(this, keyAmount(caller))), fromStr(assetIdStr)), DeleteEntry(assetIdKey), DeleteEntry(keyAmount(caller)), DeleteEntry(keyPartner(caller)), DeleteEntry(keyWantedAssetId(caller)), DeleteEntry(keyWantedAmount(caller))] | |
93 | 111 | } | |
94 | 112 | } | |
95 | 113 | ||
96 | 114 |
github/deemru/w8io/6500d08 37.58 ms ◑