tx · HfiTjrVGRkGE8zY7SYCwr57oyRWD6tjRhgGXt6oLSb8B 3N8wRE9tq89N5SobanYnQjkt3B4FV4Xrwyg: -0.00200000 Waves 2025.03.20 11:01 [3552110] smart account 3N8wRE9tq89N5SobanYnQjkt3B4FV4Xrwyg > SELF 0.00000000 Waves
{ "type": 13, "id": "HfiTjrVGRkGE8zY7SYCwr57oyRWD6tjRhgGXt6oLSb8B", "fee": 200000, "feeAssetId": null, "timestamp": 1742457725479, "version": 1, "sender": "3N8wRE9tq89N5SobanYnQjkt3B4FV4Xrwyg", "senderPublicKey": "9d3TkbCQgSgxHhod7UjRN4uuNmKaBp8jz2zJ6DaYPh5Q", "proofs": [ "41jMmK89HkporcC4WnsYboqgePeSpQgTyZG82G672XTsHtuNqP2F31EkjdUNPk4r2JbeKx6yvyh6H2tKz1MUmAMq" ], "script": "base64:BwILCAISBwoFCAgIAQENAANTRVACAl9fAAt3YXZlc1N0cmluZwIFV0FWRVMAEGNvbnRyYWN0RmlsZW5hbWUCE3RyYW5zZmVyLXByb3h5LnJpZGUBB3dyYXBFcnIBAXMJAKwCAgkArAICBRBjb250cmFjdEZpbGVuYW1lAgI6IAUBcwEIdGhyb3dFcnIBAXMJAAIBCQEHd3JhcEVycgEFAXMAE2tleUFsbG93ZWRBZGRyZXNzZXMJALkJAgkAzAgCAgIlcwkAzAgCAhBhbGxvd2VkQWRkcmVzc2VzBQNuaWwFA1NFUAEHa2V5VHhJZAEKdHJhbnNmZXJJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgICdHgJAMwIAgUKdHJhbnNmZXJJZAUDbmlsBQNTRVABCmtleUludm9pY2UBCnRyYW5zZmVySWQJALkJAgkAzAgCAgQlcyVzCQDMCAICB2ludm9pY2UJAMwIAgUKdHJhbnNmZXJJZAUDbmlsBQNTRVABCXR4SWRWYWx1ZQEEdHhJZAkAuQkCCQDMCAICAiVzCQDMCAIFBHR4SWQFA25pbAUDU0VQAQxpbnZvaWNlVmFsdWUEBWFzc2V0BmFtb3VudAVwcmljZQl0aW1lc3RhbXAEDGFtb3VudFN0cmluZwkApAMBBQZhbW91bnQEC3ByaWNlU3RyaW5nCQCkAwEFBXByaWNlBA90aW1lc3RhbXBTdHJpbmcJAKQDAQUJdGltZXN0YW1wCQC5CQIJAMwIAgIIJXMlZCVkJWQJAMwIAgUFYXNzZXQJAMwIAgUMYW1vdW50U3RyaW5nCQDMCAIFC3ByaWNlU3RyaW5nCQDMCAIFD3RpbWVzdGFtcFN0cmluZwUDbmlsBQNTRVABDHBhcnNlQXNzZXRJZAEFaW5wdXQDCQAAAgUFaW5wdXQFC3dhdmVzU3RyaW5nBQR1bml0CQDZBAEFBWlucHV0AQ9hc3NldElkVG9TdHJpbmcBBWlucHV0AwkAAAIFBWlucHV0BQR1bml0BQt3YXZlc1N0cmluZwkA2AQBCQEFdmFsdWUBBQVpbnB1dAEQaXNBZGRyZXNzQWxsb3dlZAEHYWRkcmVzcwQHJG1hdGNoMAkAnQgCBQR0aGlzBRNrZXlBbGxvd2VkQWRkcmVzc2VzAwkAAQIFByRtYXRjaDACBlN0cmluZwQEbGlzdAUHJG1hdGNoMAkBD2NvbnRhaW5zRWxlbWVudAIJAL0JAgUEbGlzdAUDU0VQBQdhZGRyZXNzBgEBaQEIdHJhbnNmZXIFC3RyYW5zZmVyX2lkCXJlY2lwaWVudAVhc3NldAZhbW91bnQFcHJpY2UEBmNoZWNrcwkAzAgCAwkBASEBCQEJaXNEZWZpbmVkAQkAoggBCQEHa2V5VHhJZAEFC3RyYW5zZmVyX2lkBgkBCHRocm93RXJyAQIbdHJhbnNmZXJfaWQgaXMgYWxyZWFkeSB1c2VkCQDMCAIDCQEQaXNBZGRyZXNzQWxsb3dlZAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIdY2FsbGVyIGFkZHJlc3MgaXMgbm90IGFsbG93ZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQFYmxvY2sJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7QcBBQZoZWlnaHQJAQd3cmFwRXJyAQIYY291bGQgbm90IGdldCBibG9jayBpbmZvBBByZWNpcGllbnRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQlyZWNpcGllbnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUQcmVjaXBpZW50QWRkcmVzcwUGYW1vdW50CQEMcGFyc2VBc3NldElkAQUFYXNzZXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR4SWQBBQt0cmFuc2Zlcl9pZAkBCXR4SWRWYWx1ZQEJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5SW52b2ljZQEFC3RyYW5zZmVyX2lkCQEMaW52b2ljZVZhbHVlBAUFYXNzZXQFBmFtb3VudAUFcHJpY2UIBQVibG9jawl0aW1lc3RhbXAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAHRVfr", "chainId": 84, "height": 3552110, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CadguC9YBFgqWqkyTnXgW54pcJwVhrrGSo3ABFsG5nV7 Next: 2zVxGvoHZ4njdyLtCoUJUroiUa8CTFhABn56AwP9tm3D Diff:
Old | New | Differences | |
---|---|---|---|
12 | 12 | ||
13 | 13 | func throwErr (s) = throw(wrapErr(s)) | |
14 | 14 | ||
15 | + | ||
16 | + | let keyAllowedAddresses = makeString(["%s", "allowedAddresses"], SEP) | |
15 | 17 | ||
16 | 18 | func keyTxId (transferId) = makeString(["%s%s", "tx", transferId], SEP) | |
17 | 19 | ||
40 | 42 | else toBase58String(value(input)) | |
41 | 43 | ||
42 | 44 | ||
45 | + | func isAddressAllowed (address) = match getString(this, keyAllowedAddresses) { | |
46 | + | case list: String => | |
47 | + | containsElement(split_51C(list, SEP), address) | |
48 | + | case _ => | |
49 | + | true | |
50 | + | } | |
51 | + | ||
52 | + | ||
43 | 53 | @Callable(i) | |
44 | 54 | func transfer (transfer_id,recipient,asset,amount,price) = { | |
45 | 55 | let checks = [if (!(isDefined(getString(keyTxId(transfer_id))))) | |
46 | 56 | then true | |
47 | - | else throwErr("transfer_id is already used")] | |
57 | + | else throwErr("transfer_id is already used"), if (isAddressAllowed(toString(i.caller))) | |
58 | + | then true | |
59 | + | else throwErr("caller address is not allowed")] | |
48 | 60 | if ((checks == checks)) | |
49 | 61 | then { | |
50 | 62 | let block = valueOrErrorMessage(blockInfoByHeight(height), wrapErr("could not get block info")) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 7 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let SEP = "__" | |
5 | 5 | ||
6 | 6 | let wavesString = "WAVES" | |
7 | 7 | ||
8 | 8 | let contractFilename = "transfer-proxy.ride" | |
9 | 9 | ||
10 | 10 | func wrapErr (s) = ((contractFilename + ": ") + s) | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | func throwErr (s) = throw(wrapErr(s)) | |
14 | 14 | ||
15 | + | ||
16 | + | let keyAllowedAddresses = makeString(["%s", "allowedAddresses"], SEP) | |
15 | 17 | ||
16 | 18 | func keyTxId (transferId) = makeString(["%s%s", "tx", transferId], SEP) | |
17 | 19 | ||
18 | 20 | ||
19 | 21 | func keyInvoice (transferId) = makeString(["%s%s", "invoice", transferId], SEP) | |
20 | 22 | ||
21 | 23 | ||
22 | 24 | func txIdValue (txId) = makeString(["%s", txId], SEP) | |
23 | 25 | ||
24 | 26 | ||
25 | 27 | func invoiceValue (asset,amount,price,timestamp) = { | |
26 | 28 | let amountString = toString(amount) | |
27 | 29 | let priceString = toString(price) | |
28 | 30 | let timestampString = toString(timestamp) | |
29 | 31 | makeString(["%s%d%d%d", asset, amountString, priceString, timestampString], SEP) | |
30 | 32 | } | |
31 | 33 | ||
32 | 34 | ||
33 | 35 | func parseAssetId (input) = if ((input == wavesString)) | |
34 | 36 | then unit | |
35 | 37 | else fromBase58String(input) | |
36 | 38 | ||
37 | 39 | ||
38 | 40 | func assetIdToString (input) = if ((input == unit)) | |
39 | 41 | then wavesString | |
40 | 42 | else toBase58String(value(input)) | |
41 | 43 | ||
42 | 44 | ||
45 | + | func isAddressAllowed (address) = match getString(this, keyAllowedAddresses) { | |
46 | + | case list: String => | |
47 | + | containsElement(split_51C(list, SEP), address) | |
48 | + | case _ => | |
49 | + | true | |
50 | + | } | |
51 | + | ||
52 | + | ||
43 | 53 | @Callable(i) | |
44 | 54 | func transfer (transfer_id,recipient,asset,amount,price) = { | |
45 | 55 | let checks = [if (!(isDefined(getString(keyTxId(transfer_id))))) | |
46 | 56 | then true | |
47 | - | else throwErr("transfer_id is already used")] | |
57 | + | else throwErr("transfer_id is already used"), if (isAddressAllowed(toString(i.caller))) | |
58 | + | then true | |
59 | + | else throwErr("caller address is not allowed")] | |
48 | 60 | if ((checks == checks)) | |
49 | 61 | then { | |
50 | 62 | let block = valueOrErrorMessage(blockInfoByHeight(height), wrapErr("could not get block info")) | |
51 | 63 | let recipientAddress = addressFromStringValue(recipient) | |
52 | 64 | [ScriptTransfer(recipientAddress, amount, parseAssetId(asset)), StringEntry(keyTxId(transfer_id), txIdValue(toBase58String(i.transactionId))), StringEntry(keyInvoice(transfer_id), invoiceValue(asset, amount, price, block.timestamp))] | |
53 | 65 | } | |
54 | 66 | else throw("Strict value is not equal to itself.") | |
55 | 67 | } | |
56 | 68 | ||
57 | 69 |
github/deemru/w8io/169f3d6 16.41 ms ◑![]()