tx · ekrk3RoaYGx5v5Sm47tvYU1fNAuUmsg9N85pwhynBd3 3N91zFrRoofbPpkoDbWKrQsQSdLu2EgLL8c: -0.01000000 Waves 2023.10.23 15:18 [2811243] smart account 3N91zFrRoofbPpkoDbWKrQsQSdLu2EgLL8c > SELF 0.00000000 Waves
{ "type": 13, "id": "ekrk3RoaYGx5v5Sm47tvYU1fNAuUmsg9N85pwhynBd3", "fee": 1000000, "feeAssetId": null, "timestamp": 1698063557163, "version": 2, "chainId": 84, "sender": "3N91zFrRoofbPpkoDbWKrQsQSdLu2EgLL8c", "senderPublicKey": "5FyjUYCR5Q8jvG6ri6Ysz574HerUK6r1LJzzQ7DvSkLk", "proofs": [ "8g2PBmSCgLE8emHD7Vaxy5Fvq1Z5GLzNN1ZcV653aSuSMtMNnqqPnobRmbNa6yBUwvqzrVqNDUYspcgUkwdvKJY" ], "script": "base64:BgIWCAISBgoEAgICARIECgICAhIECgIIAhoACXNlcGFyYXRvcgICX18AB2NoYWluSWQJAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEACGNoYWluSWRUAQFUAAhjaGFpbklkVwEBVwELbXVzdEFkZHJlc3MCAWkHYWRkcmVzcwMJAAACCAUBaQZjYWxsZXIFB2FkZHJlc3MGCQACAQIRcGVybWlzc2lvbiBkZW5pZWQBCG11c3RUaGlzAQFpCQELbXVzdEFkZHJlc3MCBQFpBQR0aGlzABFrU2VydmljZVB1YmxpY0tleQIUJXNfX3NlcnZpY2VQdWJsaWNLZXkADWtCb3RQdWJsaWNLZXkCECVzX19ib3RQdWJsaWNLZXkADmtBY2NvdW50U2NyaXB0AhElc19fYWNjb3VudFNjcmlwdAENYWNjb3VudFNjcmlwdAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQR0aGlzBQ5rQWNjb3VudFNjcmlwdAIZYWNjb3VudCBzY3JpcHQgaXMgbm90IHNldAANa1Jld2FyZEFtb3VudAIQJXNfX3Jld2FyZEFtb3VudAEMcmV3YXJkQW1vdW50AAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFDWtSZXdhcmRBbW91bnQCGHJld2FyZCBhbW91bnQgaXMgbm90IHNldAAUQUNDT1VOVF9TVEFUVVNfRU1QVFkAAAAUQUNDT1VOVF9TVEFUVVNfUkVBRFkAAQEOa0FjY291bnRTdGF0dXMBCWFjY291bnRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgUJYWNjb3VudElkCQDMCAICBnN0YXR1cwUDbmlsBQlzZXBhcmF0b3IBDWFjY291bnRTdGF0dXMBCWFjY291bnRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAQ5rQWNjb3VudFN0YXR1cwEFCWFjY291bnRJZAIUYWNjb3VudCBpcyBub3QgZm91bmQBGGtBY2NvdW50Q3JlYXRvclB1YmxpY0tleQEJYWNjb3VudElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCBQlhY2NvdW50SWQJAMwIAgIQY3JlYXRvclB1YmxpY0tleQUDbmlsBQlzZXBhcmF0b3IBFmtBY2NvdW50T3duZXJQdWJsaWNLZXkBCWFjY291bnRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgUJYWNjb3VudElkCQDMCAICDm93bmVyUHVibGljS2V5BQNuaWwFCXNlcGFyYXRvcgEVa0FjY291bnRBbW91bnRBc3NldElkAQlhY2NvdW50SWQJALkJAgkAzAgCAgQlcyVzCQDMCAIFCWFjY291bnRJZAkAzAgCAg1hbW91bnRBc3NldElkBQNuaWwFCXNlcGFyYXRvcgEUa0FjY291bnRQcmljZUFzc2V0SWQBCWFjY291bnRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgUJYWNjb3VudElkCQDMCAICDHByaWNlQXNzZXRJZAUDbmlsBQlzZXBhcmF0b3IBHGtBY2NvdW50SWRUb0FjY291bnRQdWJsaWNLZXkBCWFjY291bnRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgUJYWNjb3VudElkCQDMCAICG2FjY291bnRJZFRvQWNjb3VudFB1YmxpY0tleQUDbmlsBQlzZXBhcmF0b3IBGmtBY2NvdW50QWRkcmVzc1RvQWNjb3VudElkAQ5hY2NvdW50QWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgkApQgBBQ5hY2NvdW50QWRkcmVzcwkAzAgCAhlhY2NvdW50QWRkcmVzc1RvQWNjb3VudElkBQNuaWwFCXNlcGFyYXRvcgEMa1BhaXJBbGxvd2VkAg1hbW91bnRBc3NldElkDHByaWNlQXNzZXRJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCCQDYBAEFDWFtb3VudEFzc2V0SWQJAMwIAgkA2AQBBQxwcmljZUFzc2V0SWQJAMwIAgILcGFpckFsbG93ZWQFA25pbAUJc2VwYXJhdG9yAQtwYWlyQWxsb3dlZAINYW1vdW50QXNzZXRJZAxwcmljZUFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkBDGtQYWlyQWxsb3dlZAIFDWFtb3VudEFzc2V0SWQFDHByaWNlQXNzZXRJZAcADnNlcnZpY2VBZGRyZXNzCQCnCAEJARFAZXh0ck5hdGl2ZSgxMDUyKQIFBHRoaXMFEWtTZXJ2aWNlUHVibGljS2V5AAxib3RQdWJsaWNLZXkJARFAZXh0ck5hdGl2ZSgxMDUyKQIFBHRoaXMFDWtCb3RQdWJsaWNLZXkDAWkBBGluaXQEEHNlcnZpY2VQdWJsaWNLZXkMYm90UHVibGljS2V5DWFjY291bnRTY3JpcHQMcmV3YXJkQW1vdW50BAtjaGVja0NhbGxlcgkBCG11c3RUaGlzAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIJAJQKAgkAzAgCCQELQmluYXJ5RW50cnkCBRFrU2VydmljZVB1YmxpY0tleQUQc2VydmljZVB1YmxpY0tleQkAzAgCCQELQmluYXJ5RW50cnkCBQ1rQm90UHVibGljS2V5BQxib3RQdWJsaWNLZXkJAMwIAgkBC0JpbmFyeUVudHJ5AgUOa0FjY291bnRTY3JpcHQFDWFjY291bnRTY3JpcHQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtSZXdhcmRBbW91bnQFDHJld2FyZEFtb3VudAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3JlcXVlc3QCDWFtb3VudEFzc2V0SWQMcHJpY2VBc3NldElkBAlhY2NvdW50SWQJANgEAQkA9wMBCQDLAQIJAMsBAggIBQFpBmNhbGxlcgVieXRlcwUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkBAZjaGVja3MJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQACAQIVMSBwYXltZW50IGlzIHJlcXVpcmVkCQDMCAIDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0BgkAAgECDWludmFsaWQgYXNzZXQJAMwIAgMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDHJld2FyZEFtb3VudAAGCQACAQIOaW52YWxpZCBhbW91bnQJAMwIAgMJAQtwYWlyQWxsb3dlZAIFDWFtb3VudEFzc2V0SWQFDHByaWNlQXNzZXRJZAYJAAIBAhNwYWlyIGlzIG5vdCBhbGxvd2VkCQDMCAIDCQAAAgkAmggCBQR0aGlzCQEOa0FjY291bnRTdGF0dXMBBQlhY2NvdW50SWQFBHVuaXQGCQACAQIWYWNjb3VudCBhbHJlYWR5IGV4aXN0cwUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rQWNjb3VudFN0YXR1cwEFCWFjY291bnRJZAAACQDMCAIJAQtCaW5hcnlFbnRyeQIJARZrQWNjb3VudE93bmVyUHVibGljS2V5AQUJYWNjb3VudElkCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAMwIAgkBC0JpbmFyeUVudHJ5AgkBFWtBY2NvdW50QW1vdW50QXNzZXRJZAEFCWFjY291bnRJZAUNYW1vdW50QXNzZXRJZAkAzAgCCQELQmluYXJ5RW50cnkCCQEUa0FjY291bnRQcmljZUFzc2V0SWQBBQlhY2NvdW50SWQFDHByaWNlQXNzZXRJZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGNvbXBsZXRlAglhY2NvdW50SWQQY3JlYXRvclB1YmxpY0tleQQQYWNjb3VudFB1YmxpY0tleQgFAWkPY2FsbGVyUHVibGljS2V5BA5hY2NvdW50QWRkcmVzcwgFAWkGY2FsbGVyBAZjaGVja3MJAMwIAgMJAAACCQENYWNjb3VudFN0YXR1cwEFCWFjY291bnRJZAUUQUNDT1VOVF9TVEFUVVNfRU1QVFkGCQACAQIZYWNjb3VudCBpcyBhbHJlYWR5IGV4aXN0cwkAzAgCAwQHJG1hdGNoMAkA8QcBBQ5hY2NvdW50QWRkcmVzcwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQAAAgUBYgkA8RUBCQENYWNjb3VudFNjcmlwdAAHBgkAAgECDmludmFsaWQgc2NyaXB0BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDmNyZWF0b3JBZGRyZXNzCQCnCAEFEGNyZWF0b3JQdWJsaWNLZXkJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmtBY2NvdW50U3RhdHVzAQUJYWNjb3VudElkBRRBQ0NPVU5UX1NUQVRVU19SRUFEWQkAzAgCCQELQmluYXJ5RW50cnkCCQEYa0FjY291bnRDcmVhdG9yUHVibGljS2V5AQUJYWNjb3VudElkBRBjcmVhdG9yUHVibGljS2V5CQDMCAIJAQtCaW5hcnlFbnRyeQIJARxrQWNjb3VudElkVG9BY2NvdW50UHVibGljS2V5AQUJYWNjb3VudElkBRBhY2NvdW50UHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprQWNjb3VudEFkZHJlc3NUb0FjY291bnRJZAEFDmFjY291bnRBZGRyZXNzBQlhY2NvdW50SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOY3JlYXRvckFkZHJlc3MJAQxyZXdhcmRBbW91bnQABQR1bml0BQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4At2KY4A==", "height": 2811243, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4veqf1rKZj98VkW5eHW4Xpq45bP1axVAgNLFxRCMHqDy Next: 7t3hKbDaEDscitJVr4p2E8VYHPpHPdBu2XdTzHaHbpfw Diff:
Old | New | Differences | |
---|---|---|---|
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let separator = "__" | |
5 | 5 | ||
6 | + | let chainId = take(drop(this.bytes, 1), 1) | |
7 | + | ||
8 | + | let chainIdT = base58'2T' | |
9 | + | ||
10 | + | let chainIdW = base58'2W' | |
11 | + | ||
6 | 12 | func mustAddress (i,address) = if ((i.caller == address)) | |
7 | 13 | then true | |
8 | - | else throw() | |
14 | + | else throw("permission denied") | |
9 | 15 | ||
10 | 16 | ||
11 | 17 | func mustThis (i) = mustAddress(i, this) | |
53 | 59 | func kAccountAddressToAccountId (accountAddress) = makeString(["%s%s", toString(accountAddress), "accountAddressToAccountId"], separator) | |
54 | 60 | ||
55 | 61 | ||
62 | + | func kPairAllowed (amountAssetId,priceAssetId) = makeString(["%s%s%s", toBase58String(amountAssetId), toBase58String(priceAssetId), "pairAllowed"], separator) | |
63 | + | ||
64 | + | ||
65 | + | func pairAllowed (amountAssetId,priceAssetId) = valueOrElse(getBoolean(this, kPairAllowed(amountAssetId, priceAssetId)), false) | |
66 | + | ||
67 | + | ||
56 | 68 | let serviceAddress = addressFromPublicKey(getBinaryValue(this, kServicePublicKey)) | |
57 | 69 | ||
58 | 70 | let botPublicKey = getBinaryValue(this, kBotPublicKey) | |
76 | 88 | then true | |
77 | 89 | else throw("invalid asset"), if ((i.payments[0].amount == rewardAmount())) | |
78 | 90 | then true | |
79 | - | else throw("invalid amount"), if ((getInteger(this, kAccountStatus(accountId)) == unit)) | |
91 | + | else throw("invalid amount"), if (pairAllowed(amountAssetId, priceAssetId)) | |
92 | + | then true | |
93 | + | else throw("pair is not allowed"), if ((getInteger(this, kAccountStatus(accountId)) == unit)) | |
80 | 94 | then true | |
81 | 95 | else throw("account already exists")] | |
82 | 96 | if ((checks == checks)) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let separator = "__" | |
5 | 5 | ||
6 | + | let chainId = take(drop(this.bytes, 1), 1) | |
7 | + | ||
8 | + | let chainIdT = base58'2T' | |
9 | + | ||
10 | + | let chainIdW = base58'2W' | |
11 | + | ||
6 | 12 | func mustAddress (i,address) = if ((i.caller == address)) | |
7 | 13 | then true | |
8 | - | else throw() | |
14 | + | else throw("permission denied") | |
9 | 15 | ||
10 | 16 | ||
11 | 17 | func mustThis (i) = mustAddress(i, this) | |
12 | 18 | ||
13 | 19 | ||
14 | 20 | let kServicePublicKey = "%s__servicePublicKey" | |
15 | 21 | ||
16 | 22 | let kBotPublicKey = "%s__botPublicKey" | |
17 | 23 | ||
18 | 24 | let kAccountScript = "%s__accountScript" | |
19 | 25 | ||
20 | 26 | func accountScript () = valueOrErrorMessage(getBinary(this, kAccountScript), "account script is not set") | |
21 | 27 | ||
22 | 28 | ||
23 | 29 | let kRewardAmount = "%s__rewardAmount" | |
24 | 30 | ||
25 | 31 | func rewardAmount () = valueOrErrorMessage(getInteger(this, kRewardAmount), "reward amount is not set") | |
26 | 32 | ||
27 | 33 | ||
28 | 34 | let ACCOUNT_STATUS_EMPTY = 0 | |
29 | 35 | ||
30 | 36 | let ACCOUNT_STATUS_READY = 1 | |
31 | 37 | ||
32 | 38 | func kAccountStatus (accountId) = makeString(["%s%s", accountId, "status"], separator) | |
33 | 39 | ||
34 | 40 | ||
35 | 41 | func accountStatus (accountId) = valueOrErrorMessage(getInteger(this, kAccountStatus(accountId)), "account is not found") | |
36 | 42 | ||
37 | 43 | ||
38 | 44 | func kAccountCreatorPublicKey (accountId) = makeString(["%s%s", accountId, "creatorPublicKey"], separator) | |
39 | 45 | ||
40 | 46 | ||
41 | 47 | func kAccountOwnerPublicKey (accountId) = makeString(["%s%s", accountId, "ownerPublicKey"], separator) | |
42 | 48 | ||
43 | 49 | ||
44 | 50 | func kAccountAmountAssetId (accountId) = makeString(["%s%s", accountId, "amountAssetId"], separator) | |
45 | 51 | ||
46 | 52 | ||
47 | 53 | func kAccountPriceAssetId (accountId) = makeString(["%s%s", accountId, "priceAssetId"], separator) | |
48 | 54 | ||
49 | 55 | ||
50 | 56 | func kAccountIdToAccountPublicKey (accountId) = makeString(["%s%s", accountId, "accountIdToAccountPublicKey"], separator) | |
51 | 57 | ||
52 | 58 | ||
53 | 59 | func kAccountAddressToAccountId (accountAddress) = makeString(["%s%s", toString(accountAddress), "accountAddressToAccountId"], separator) | |
54 | 60 | ||
55 | 61 | ||
62 | + | func kPairAllowed (amountAssetId,priceAssetId) = makeString(["%s%s%s", toBase58String(amountAssetId), toBase58String(priceAssetId), "pairAllowed"], separator) | |
63 | + | ||
64 | + | ||
65 | + | func pairAllowed (amountAssetId,priceAssetId) = valueOrElse(getBoolean(this, kPairAllowed(amountAssetId, priceAssetId)), false) | |
66 | + | ||
67 | + | ||
56 | 68 | let serviceAddress = addressFromPublicKey(getBinaryValue(this, kServicePublicKey)) | |
57 | 69 | ||
58 | 70 | let botPublicKey = getBinaryValue(this, kBotPublicKey) | |
59 | 71 | ||
60 | 72 | @Callable(i) | |
61 | 73 | func init (servicePublicKey,botPublicKey,accountScript,rewardAmount) = { | |
62 | 74 | let checkCaller = mustThis(i) | |
63 | 75 | if ((checkCaller == checkCaller)) | |
64 | 76 | then $Tuple2([BinaryEntry(kServicePublicKey, servicePublicKey), BinaryEntry(kBotPublicKey, botPublicKey), BinaryEntry(kAccountScript, accountScript), IntegerEntry(kRewardAmount, rewardAmount)], unit) | |
65 | 77 | else throw("Strict value is not equal to itself.") | |
66 | 78 | } | |
67 | 79 | ||
68 | 80 | ||
69 | 81 | ||
70 | 82 | @Callable(i) | |
71 | 83 | func request (amountAssetId,priceAssetId) = { | |
72 | 84 | let accountId = toBase58String(sha256(((i.caller.bytes + amountAssetId) + priceAssetId))) | |
73 | 85 | let checks = [if ((size(i.payments) == 1)) | |
74 | 86 | then true | |
75 | 87 | else throw("1 payment is required"), if ((i.payments[0].assetId == unit)) | |
76 | 88 | then true | |
77 | 89 | else throw("invalid asset"), if ((i.payments[0].amount == rewardAmount())) | |
78 | 90 | then true | |
79 | - | else throw("invalid amount"), if ((getInteger(this, kAccountStatus(accountId)) == unit)) | |
91 | + | else throw("invalid amount"), if (pairAllowed(amountAssetId, priceAssetId)) | |
92 | + | then true | |
93 | + | else throw("pair is not allowed"), if ((getInteger(this, kAccountStatus(accountId)) == unit)) | |
80 | 94 | then true | |
81 | 95 | else throw("account already exists")] | |
82 | 96 | if ((checks == checks)) | |
83 | 97 | then $Tuple2([IntegerEntry(kAccountStatus(accountId), 0), BinaryEntry(kAccountOwnerPublicKey(accountId), i.callerPublicKey), BinaryEntry(kAccountAmountAssetId(accountId), amountAssetId), BinaryEntry(kAccountPriceAssetId(accountId), priceAssetId)], unit) | |
84 | 98 | else throw("Strict value is not equal to itself.") | |
85 | 99 | } | |
86 | 100 | ||
87 | 101 | ||
88 | 102 | ||
89 | 103 | @Callable(i) | |
90 | 104 | func complete (accountId,creatorPublicKey) = { | |
91 | 105 | let accountPublicKey = i.callerPublicKey | |
92 | 106 | let accountAddress = i.caller | |
93 | 107 | let checks = [if ((accountStatus(accountId) == ACCOUNT_STATUS_EMPTY)) | |
94 | 108 | then true | |
95 | 109 | else throw("account is already exists"), if ( match scriptHash(accountAddress) { | |
96 | 110 | case b: ByteVector => | |
97 | 111 | (b == blake2b256_32Kb(accountScript())) | |
98 | 112 | case _ => | |
99 | 113 | false | |
100 | 114 | }) | |
101 | 115 | then true | |
102 | 116 | else throw("invalid script")] | |
103 | 117 | if ((checks == checks)) | |
104 | 118 | then { | |
105 | 119 | let creatorAddress = addressFromPublicKey(creatorPublicKey) | |
106 | 120 | $Tuple2([IntegerEntry(kAccountStatus(accountId), ACCOUNT_STATUS_READY), BinaryEntry(kAccountCreatorPublicKey(accountId), creatorPublicKey), BinaryEntry(kAccountIdToAccountPublicKey(accountId), accountPublicKey), StringEntry(kAccountAddressToAccountId(accountAddress), accountId), ScriptTransfer(creatorAddress, rewardAmount(), unit)], unit) | |
107 | 121 | } | |
108 | 122 | else throw("Strict value is not equal to itself.") | |
109 | 123 | } | |
110 | 124 | ||
111 | 125 |
github/deemru/w8io/169f3d6 31.27 ms ◑![]()