tx · 46LwivnB1dmdX5cfkNLNFzrHSmPpaNEwWa6G2sEcZfnx 3MrHW8ptB8Qh2VGuuZ2BEhC5pwW6YCXMUBw: -0.01400000 Waves 2019.08.24 19:47 [645479] smart account 3MrHW8ptB8Qh2VGuuZ2BEhC5pwW6YCXMUBw > SELF 0.00000000 Waves
{ "type": 13, "id": "46LwivnB1dmdX5cfkNLNFzrHSmPpaNEwWa6G2sEcZfnx", "fee": 1400000, "feeAssetId": null, "timestamp": 1566665229651, "version": 1, "sender": "3MrHW8ptB8Qh2VGuuZ2BEhC5pwW6YCXMUBw", "senderPublicKey": "2kcPWzVcK2fjb5eKH3KjTUuH3EnT1fRjDMndK5QGgi9h", "proofs": [ "4S4tUq1fRotXSnpn3hRxSdYST3sGaBDWm1SwBLDpP6JXQ9KBvpoufVdCSj8gUEoNPYEsqdSzSJk7x439WF7qph2M" ], "script": "base64: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", "chainId": 84, "height": 645479, "spentComplexity": 0 } View: original | compacted Prev: En9EM9qwz9Vyk2tVm6fEeLc8qMX2jxa3te26RcR6Af5H Next: none Diff:
Old | New | Differences | |
---|---|---|---|
11 | 11 | ||
12 | 12 | let targetPrice = 35000000 | |
13 | 13 | ||
14 | - | let betEndTs = ( | |
14 | + | let betEndTs = (1566665196000 + ((10 * 60) * 1000)) | |
15 | 15 | ||
16 | - | let tradeEndTs = ( | |
16 | + | let tradeEndTs = (1566665196000 + ((15 * 60) * 1000)) | |
17 | 17 | ||
18 | 18 | let devFee = 100000000 | |
19 | 19 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 3 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let matcherPubKey = base58'8QUAqtTckM5B8gvcuP7mMswat9SjKUuafJMusEoSn1Gy' | |
5 | 5 | ||
6 | 6 | let priceAsset = unit | |
7 | 7 | ||
8 | 8 | let amountAsset = base58'33kV5hRVtgEGpYqhp9wQn2g9hP1fNWSYGCzzYk1T9Hyg' | |
9 | 9 | ||
10 | 10 | let orderExpire = ((6 * 60) * 1000) | |
11 | 11 | ||
12 | 12 | let targetPrice = 35000000 | |
13 | 13 | ||
14 | - | let betEndTs = ( | |
14 | + | let betEndTs = (1566665196000 + ((10 * 60) * 1000)) | |
15 | 15 | ||
16 | - | let tradeEndTs = ( | |
16 | + | let tradeEndTs = (1566665196000 + ((15 * 60) * 1000)) | |
17 | 17 | ||
18 | 18 | let devFee = 100000000 | |
19 | 19 | ||
20 | 20 | let maxFee = 5000000 | |
21 | 21 | ||
22 | 22 | let minProcessAmount = 10000000 | |
23 | 23 | ||
24 | 24 | func checkFee (i) = if ((i.fee > maxFee)) | |
25 | 25 | then throw("unreasonable large fee") | |
26 | 26 | else if ((i.feeAssetId != unit)) | |
27 | 27 | then throw("fee must be in WAVES") | |
28 | 28 | else true | |
29 | 29 | ||
30 | 30 | ||
31 | 31 | func repayFee (i,ws,amount,recipient,assetId) = if (checkFee(i)) | |
32 | 32 | then if (if ((amount > 0)) | |
33 | 33 | then isDefined(recipient) | |
34 | 34 | else false) | |
35 | 35 | then ScriptResult(ws, TransferSet([ScriptTransfer(i.caller, i.fee, unit), ScriptTransfer(extract(recipient), amount, assetId)])) | |
36 | 36 | else ScriptResult(ws, TransferSet([ScriptTransfer(i.caller, i.fee, unit)])) | |
37 | 37 | else throw("error") | |
38 | 38 | ||
39 | 39 | ||
40 | 40 | func getAssetMnemonic (assetId) = match assetId { | |
41 | 41 | case assetBV: ByteVector => | |
42 | 42 | toBase58String(assetBV) | |
43 | 43 | case assetStr: String => | |
44 | 44 | assetStr | |
45 | 45 | case _ => | |
46 | 46 | "WAVES" | |
47 | 47 | } | |
48 | 48 | ||
49 | 49 | ||
50 | 50 | func getDefaultedInt (key,default) = match getInteger(this, key) { | |
51 | 51 | case i: Int => | |
52 | 52 | i | |
53 | 53 | case _ => | |
54 | 54 | default | |
55 | 55 | } | |
56 | 56 | ||
57 | 57 | ||
58 | 58 | @Callable(inv) | |
59 | 59 | func withdraw (owner,asset) = if (((tradeEndTs + orderExpire) > lastBlock.timestamp)) | |
60 | 60 | then throw("please wait for trade ends") | |
61 | 61 | else { | |
62 | 62 | let assetId = getAssetMnemonic(asset) | |
63 | 63 | let withdrawKey = ((("withdraw_" + owner) + "_") + assetId) | |
64 | 64 | if (isDefined(getInteger(this, withdrawKey))) | |
65 | 65 | then throw((withdrawKey + " already taken")) | |
66 | 66 | else { | |
67 | 67 | let amountTotalKey = ("total_amount_" + assetId) | |
68 | 68 | let assetTotalAmount = getDefaultedInt(amountTotalKey, 0) | |
69 | 69 | if ((assetTotalAmount == 0)) | |
70 | 70 | then throw("no fundings in specified asset recorded") | |
71 | 71 | else { | |
72 | 72 | let amountKey = ((("bet_amount_" + assetId) + "_") + owner) | |
73 | 73 | let amount = ((getDefaultedInt(amountKey, 0) * assetBalance(this, fromBase58String(asset))) / assetTotalAmount) | |
74 | 74 | repayFee(inv, WriteSet([DataEntry(withdrawKey, amount)]), (amount - devFee), addressFromString(owner), fromBase58String(asset)) | |
75 | 75 | } | |
76 | 76 | } | |
77 | 77 | } | |
78 | 78 | ||
79 | 79 | ||
80 | 80 | ||
81 | 81 | @Callable(inv) | |
82 | 82 | func registerIncomingTx (txId) = { | |
83 | 83 | let registeredKey = ("registered_" + txId) | |
84 | 84 | if ((getBoolean(this, registeredKey) == true)) | |
85 | 85 | then throw("tx already registered") | |
86 | 86 | else { | |
87 | 87 | let t = extract(transferTransactionById(fromBase58String(txId))) | |
88 | 88 | let owner = toBase58String(t.sender.bytes) | |
89 | 89 | let assetId = getAssetMnemonic(t.assetId) | |
90 | 90 | let amountKey = ((("bet_amount_" + assetId) + "_") + owner) | |
91 | 91 | let amountTotalKey = ("total_amount_" + assetId) | |
92 | 92 | let lastAmount = getDefaultedInt(amountKey, 0) | |
93 | 93 | let lastTotalAmount = getDefaultedInt(amountTotalKey, 0) | |
94 | 94 | if ((minProcessAmount > t.amount)) | |
95 | 95 | then throw("don't want to register such small amounts") | |
96 | 96 | else if ((betEndTs > lastBlock.timestamp)) | |
97 | 97 | then repayFee(inv, WriteSet([DataEntry(amountKey, (lastAmount + t.amount)), DataEntry(amountTotalKey, (lastTotalAmount + t.amount)), DataEntry(registeredKey, true)]), 0, unit, unit) | |
98 | 98 | else repayFee(inv, WriteSet([DataEntry(registeredKey, true)]), (t.amount - minProcessAmount), t.sender, t.assetId) | |
99 | 99 | } | |
100 | 100 | } | |
101 | 101 | ||
102 | 102 | ||
103 | 103 | @Verifier(tx) | |
104 | 104 | func verify () = match tx { | |
105 | 105 | case o: Order => | |
106 | 106 | if (if (if (if ((o.assetPair.priceAsset == priceAsset)) | |
107 | 107 | then (o.assetPair.amountAsset == amountAsset) | |
108 | 108 | else false) | |
109 | 109 | then (o.matcherPublicKey == matcherPubKey) | |
110 | 110 | else false) | |
111 | 111 | then (o.price == targetPrice) | |
112 | 112 | else false) | |
113 | 113 | then (orderExpire > (o.expiration - o.timestamp)) | |
114 | 114 | else false | |
115 | 115 | case _ => | |
116 | 116 | sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
117 | 117 | } | |
118 | 118 |
github/deemru/w8io/169f3d6 57.23 ms ◑![]()