tx · 9iCdPgagLcQrcs7zu8WQvW1oZuVvpvcDMuJrtXfsQKFg 3N9J3wuPH3fe1vTsLwJSticprdzZWXzZtMb: -0.01000000 Waves 2022.05.09 19:27 [2044380] smart account 3N9J3wuPH3fe1vTsLwJSticprdzZWXzZtMb > SELF 0.00000000 Waves
{ "type": 13, "id": "9iCdPgagLcQrcs7zu8WQvW1oZuVvpvcDMuJrtXfsQKFg", "fee": 1000000, "feeAssetId": null, "timestamp": 1652113657115, "version": 2, "chainId": 84, "sender": "3N9J3wuPH3fe1vTsLwJSticprdzZWXzZtMb", "senderPublicKey": "6YTEFQ5JhfL8TsLSjyXNG4TVYq2Jmu3nkmXvxD1Nj5mn", "proofs": [ "57dio3ErMxTmhpsBXb1TT9NGBRb1pZVosYCPousMg7rEfHLww8yDF18mA4zuoDVLUMBXL4zHsiDacgHSuf7tVx7g" ], "script": "base64:AAIFAAAAAAAAACEIAhIDCgECEgUKAwICAhIICgYCAgECAgISBwoFAgIBAgIAAAAUAAAAABBrZXlMb2NrUmVjaXBpZW50AgAAAANfbHIAAAAADWtleUxvY2tBbW91bnQCAAAAA19sYQAAAAASa2V5TG9ja0Rlc3RpbmF0aW9uAgAAAANfbGQAAAAAEmtleUxvY2tBc3NldFNvdXJjZQIAAAAEX2xhcwAAAAAKa2V5VmVyc2lvbgIAAAACX3YAAAAACWtleUJyaWRnZQIAAAACX2IAAAAACWtleU9yYWNsZQIAAAACX28AAAAACGtleUFkbWluAgAAAAJfYQAAAAAJa2V5VW5sb2NrAgAAAAJfdQAAAAAPZXJyVW5hdXRob3JpemVkAgAAAAx1bmF1dGhvcml6ZWQAAAAAEGVyclVuaW5pdGlhbGl6ZWQCAAAADXVuaW5pdGlhbGl6ZWQAAAAAE2VyckludmFsaWRTaWduYXR1cmUCAAAAEWludmFsaWQgc2lnbmF0dXJlAAAAABFlcnJBbHJlYWR5Q2xhaW1lZAIAAAAHY2xhaW1lZAAAAAAQZXJyQWxyZWFkeUxvY2tlZAIAAAAGbG9ja2VkAAAAAA1lcnJCcmlkZ2VPbmx5AgAAAApub3QgYnJpZGdlAAAAABBlcnJJbnZhbGlkTG9ja0lkAgAAAA5pbnZhbGlkIGxvY2tJZAEAAAANaW52YWxpZENhbGxlcgAAAAIAAAABaQAAAANrZXkEAAAAByRtYXRjaDAJAAQhAAAAAQUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAlhdXRob3JpdHkFAAAAByRtYXRjaDAJAQAAAAIhPQAAAAIFAAAACWF1dGhvcml0eQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwcBAAAAFGFzc2VydENhbGxlcklzQnJpZGdlAAAAAQAAAAFpAwkBAAAADWludmFsaWRDYWxsZXIAAAACBQAAAAFpBQAAAAlrZXlCcmlkZ2UJAAACAAAAAQUAAAANZXJyQnJpZGdlT25seQUAAAAEdW5pdAEAAAARYXNzZXJ0VmFsaWRMb2NrSWQAAAABAAAABmxvY2tJZAQAAAAHdmVyc2lvbgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAAC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aWwGCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAKY3JlYXRlTG9jawAAAAUAAAAGbG9ja0lkAAAACXJlY2lwaWVudAAAAAZhbW91bnQAAAAPbG9ja0Rlc3RpbmF0aW9uAAAAFXRva2VuU291cmNlQW5kQWRkcmVzcwQAAAAJbG9ja0lkU3RyCQACWgAAAAEFAAAABmxvY2tJZAQAAAAQbG9ja1JlY2lwaWVudEtleQkAASwAAAACBQAAAAlsb2NrSWRTdHIFAAAAEGtleUxvY2tSZWNpcGllbnQEAAAAC2NoZWNrQ2FsbGVyCQEAAAAUYXNzZXJ0Q2FsbGVySXNCcmlkZ2UAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIEAAAAC2NoZWNrTG9ja0lkCQEAAAARYXNzZXJ0VmFsaWRMb2NrSWQAAAABBQAAAAZsb2NrSWQDCQAAAAAAAAIFAAAAC2NoZWNrTG9ja0lkBQAAAAtjaGVja0xvY2tJZAQAAAAJY2hlY2tMb2NrCQEAAAATYXNzZXJ0TG9ja05vdEV4aXN0cwAAAAEFAAAAEGxvY2tSZWNpcGllbnRLZXkDCQAAAAAAAAIFAAAACWNoZWNrTG9jawUAAAAJY2hlY2tMb2NrCQAETAAAAAIJAQAAAAtCaW5hcnlFbnRyeQAAAAIJAAEsAAAAAgUAAAAJbG9ja0lkU3RyBQAAABBrZXlMb2NrUmVjaXBpZW50BQAAAAlyZWNpcGllbnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAJbG9ja0lkU3RyBQAAAA1rZXlMb2NrQW1vdW50BQAAAAZhbW91bnQJAARMAAAAAgkBAAAAC0JpbmFyeUVudHJ5AAAAAgkAASwAAAACBQAAAAlsb2NrSWRTdHIFAAAAEmtleUxvY2tEZXN0aW5hdGlvbgUAAAAPbG9ja0Rlc3RpbmF0aW9uCQAETAAAAAIJAQAAAAtCaW5hcnlFbnRyeQAAAAIJAAEsAAAAAgUAAAAJbG9ja0lkU3RyBQAAABJrZXlMb2NrQXNzZXRTb3VyY2UFAAAAFXRva2VuU291cmNlQW5kQWRkcmVzcwUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAHI/5Wk=", "height": 2044380, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: DQnU6HUeVHycVnwQhHCT6nFvBnfDsbymq5jffsRRhmte Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 5 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let keyLockRecipient = "_lr" | |
5 | + | ||
6 | + | let keyLockAmount = "_la" | |
7 | + | ||
8 | + | let keyLockDestination = "_ld" | |
9 | + | ||
10 | + | let keyLockAssetSource = "_las" | |
11 | + | ||
12 | + | let keyVersion = "_v" | |
13 | + | ||
14 | + | let keyBridge = "_b" | |
15 | + | ||
16 | + | let keyOracle = "_o" | |
17 | + | ||
18 | + | let keyAdmin = "_a" | |
19 | + | ||
20 | + | let keyUnlock = "_u" | |
21 | + | ||
22 | + | let errUnauthorized = "unauthorized" | |
23 | + | ||
24 | + | let errUninitialized = "uninitialized" | |
25 | + | ||
26 | + | let errInvalidSignature = "invalid signature" | |
27 | + | ||
28 | + | let errAlreadyClaimed = "claimed" | |
29 | + | ||
30 | + | let errAlreadyLocked = "locked" | |
31 | + | ||
32 | + | let errBridgeOnly = "not bridge" | |
33 | + | ||
34 | + | let errInvalidLockId = "invalid lockId" | |
35 | + | ||
36 | + | func invalidCaller (i,key) = match getBinary(key) { | |
37 | + | case authority: ByteVector => | |
38 | + | (authority != i.caller.bytes) | |
39 | + | case _ => | |
40 | + | false | |
41 | + | } | |
42 | + | ||
43 | + | ||
44 | + | func assertCallerIsBridge (i) = if (invalidCaller(i, keyBridge)) | |
45 | + | then throw(errBridgeOnly) | |
46 | + | else unit | |
47 | + | ||
48 | + | ||
49 | + | func assertValidLockId (lockId) = { | |
50 | + | let version = valueOrErrorMessage(getBinary(keyVersion), errUninitialized) | |
51 | + | if (if ((size(lockId) != 16)) | |
52 | + | then true | |
53 | + | else (take(lockId, 1) != version)) | |
54 | + | then throw(errInvalidLockId) | |
55 | + | else unit | |
56 | + | } | |
57 | + | ||
58 | + | ||
59 | + | func assertLockNotExists (lockRecipientKey) = match getBinary(lockRecipientKey) { | |
60 | + | case t: ByteVector => | |
61 | + | throw(errAlreadyLocked) | |
62 | + | case _ => | |
63 | + | unit | |
64 | + | } | |
65 | + | ||
66 | + | ||
67 | + | @Callable(i) | |
68 | + | func setAdmin (newAdmin) = if (invalidCaller(i, keyAdmin)) | |
69 | + | then throw(errUnauthorized) | |
70 | + | else [BinaryEntry(keyAdmin, newAdmin)] | |
71 | + | ||
72 | + | ||
73 | + | ||
74 | + | @Callable(i) | |
75 | + | func setConfig (version,bridge,oracle) = if (invalidCaller(i, keyAdmin)) | |
76 | + | then throw(errUnauthorized) | |
77 | + | else [BinaryEntry(keyVersion, version), BinaryEntry(keyBridge, bridge), BinaryEntry(keyOracle, oracle)] | |
78 | + | ||
79 | + | ||
80 | + | ||
81 | + | @Callable(i) | |
82 | + | func createUnlock (lockId,recipient,amount,lockSource,tokenSourceAndAddress,signature) = { | |
83 | + | let checkLockId = assertValidLockId(lockId) | |
84 | + | if ((checkLockId == checkLockId)) | |
85 | + | then { | |
86 | + | let checkCaller = assertCallerIsBridge(i) | |
87 | + | if ((checkCaller == checkCaller)) | |
88 | + | then { | |
89 | + | let lockIdStr = toBase64String(lockId) | |
90 | + | let lockSourceStr = toBase64String(lockSource) | |
91 | + | let unlockKey = (((lockSourceStr + "_") + lockIdStr) + keyUnlock) | |
92 | + | if (isDefined(getBoolean(unlockKey))) | |
93 | + | then throw(errAlreadyClaimed) | |
94 | + | else { | |
95 | + | let message = makeString([toBase64String(lockId), toBase64String(recipient), toString(amount), toBase64String(lockSource), toBase64String(tokenSourceAndAddress)], "_") | |
96 | + | let hash = keccak256(toBytes(message)) | |
97 | + | let recoveredKey = ecrecover(hash, signature) | |
98 | + | if ((recoveredKey != getBinaryValue(keyOracle))) | |
99 | + | then throw(errInvalidSignature) | |
100 | + | else $Tuple2([BooleanEntry(unlockKey, true)], true) | |
101 | + | } | |
102 | + | } | |
103 | + | else throw("Strict value is not equal to itself.") | |
104 | + | } | |
105 | + | else throw("Strict value is not equal to itself.") | |
106 | + | } | |
107 | + | ||
108 | + | ||
109 | + | ||
110 | + | @Callable(i) | |
111 | + | func createLock (lockId,recipient,amount,lockDestination,tokenSourceAndAddress) = { | |
112 | + | let lockIdStr = toBase64String(lockId) | |
113 | + | let lockRecipientKey = (lockIdStr + keyLockRecipient) | |
114 | + | let checkCaller = assertCallerIsBridge(i) | |
115 | + | if ((checkCaller == checkCaller)) | |
116 | + | then { | |
117 | + | let checkLockId = assertValidLockId(lockId) | |
118 | + | if ((checkLockId == checkLockId)) | |
119 | + | then { | |
120 | + | let checkLock = assertLockNotExists(lockRecipientKey) | |
121 | + | if ((checkLock == checkLock)) | |
122 | + | then [BinaryEntry((lockIdStr + keyLockRecipient), recipient), IntegerEntry((lockIdStr + keyLockAmount), amount), BinaryEntry((lockIdStr + keyLockDestination), lockDestination), BinaryEntry((lockIdStr + keyLockAssetSource), tokenSourceAndAddress)] | |
123 | + | else throw("Strict value is not equal to itself.") | |
124 | + | } | |
125 | + | else throw("Strict value is not equal to itself.") | |
126 | + | } | |
127 | + | else throw("Strict value is not equal to itself.") | |
128 | + | } | |
129 | + | ||
130 | + |
github/deemru/w8io/169f3d6 20.71 ms ◑![]()