tx · 37TExifogww359RfURTGDrep7n1gNyn53g5hGEQsSndX

3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9:  -0.01600000 Waves

2022.09.01 14:01 [2209983] smart account 3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9 > SELF 0.00000000 Waves

{ "type": 13, "id": "37TExifogww359RfURTGDrep7n1gNyn53g5hGEQsSndX", "fee": 1600000, "feeAssetId": null, "timestamp": 1662030054344, "version": 2, "chainId": 84, "sender": "3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9", "senderPublicKey": "D1X9WatF6ARMCmm3jC4Ex5Wd5VQ3LY8i1xbHNqeHqeAa", "proofs": [ "5pfn7dbepzkmdjdiyw4E4A5qFfCz1Ci5Gng5g7ZUigw8kYjksijYrPmyhszMDe4TPTonD96QC4onJM2zFAK1KUZk", "W9it2jSpY3SEBQciNnwdgesru39eF2raVR4uk228MwwZCLQo7NUp8qLKzadBWUPdePBYACMyP2DkJZMPJ21MUYo" ], "script": "base64:BgIfCAISABIECgIICBIECgIICBIDCgEEEgMKAQgSAwoBCBIAD2tQcmVmaXhQb29sTmFtZQIFcG9vbF8ABWtQYWlyAgVwYWlyXwAJa0Fzc2V0SWRBAgpBX2Fzc2V0X2lkAAlrQXNzZXRJZEICCkJfYXNzZXRfaWQAH2tMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMCIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABRrQWNoaWV2ZW1lbnRzV3JpdGVycwIUYWNoaWV2ZW1lbnRzX3dyaXRlcnMADGFkbWluUHViS2V5MQEg4qeMQDuGzRfmtEuH2+Whg6yuKqHsNy5eZQUT8rXs7wQADGFkbWluUHViS2V5MgEg6jisuQG1iDxyo54oPYHUGiJlERON346DjXz9V/GbEVkADGFkbWluUHViS2V5MwEgpzSWgrCjycddMmIBfztFJ08z6r82xAHPELd0cKonzG4AEWFkbWluUHViS2V5SW52b2tlASAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgEKaXNTZWxmQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMFBHVuaXQJAAIBAi9Pbmx5IHRoZSBPcmFjbGUgaXRzZWxmIGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbgESZ2V0UG9vbE5hbWVJZlZhbGlkAQhwb29sTmFtZQQPdW5kZXJzY29yZUluZGV4CQELdmFsdWVPckVsc2UCCQCzCQIFCHBvb2xOYW1lAgFfAP///////////wEEE3VuZGVyc2NvcmVMYXN0SW5kZXgJAQt2YWx1ZU9yRWxzZQIJALcJAgUIcG9vbE5hbWUCAV8A////////////AQQTaGFzU2luZ2xlVW5kZXJzY29yZQMDCQAAAgUPdW5kZXJzY29yZUluZGV4BRN1bmRlcnNjb3JlTGFzdEluZGV4CQBmAgUPdW5kZXJzY29yZUluZGV4AAAHCQECIT0CBQ91bmRlcnNjb3JlSW5kZXgJAGUCCQCxAgEFCHBvb2xOYW1lAAEHAwUTaGFzU2luZ2xlVW5kZXJzY29yZQUIcG9vbE5hbWUJAAIBAk5Qb29sIG5hbWUgbXVzdCBjb25zaXN0IG9mIHR3byBhc3NldCBuYW1lcyBzZXBhcmF0ZWQgYnkgYW4gdW5kZXJzY29yZSBjaGFyYWN0ZXIBC2dldFBvb2xUeXBlAQtwb29sQWRkcmVzcwQHdmVyc2lvbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFC3Bvb2xBZGRyZXNzAgd2ZXJzaW9uAhdQb29sIGlzIG5vdCBpbml0aWFsaXplZAMJAAACBQd2ZXJzaW9uAgUxLjAuMAIEY3BtbQMJAAACBQd2ZXJzaW9uAgUyLjAuMAIEZmxhdAMJAAACBQd2ZXJzaW9uAgUzLjAuMAIKbXVsdHljdXJ2ZQkAAgECF1Vua25vd24gdmVyc2lvbiBvZiBwb29sARFnZXRBZGRyZXNzSWZWYWxpZAEHYWRkcmVzcwkApQgBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUHYWRkcmVzcwkArAICCQCsAgICDUNhbid0IHBhcnNlICIFB2FkZHJlc3MCDCIgYXMgYWRkcmVzcwYBaQEIc2V0QWRtaW4ACQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkJAMwIAgkBC1N0cmluZ0VudHJ5AgUNa0FkbWluUHViS2V5MQkA2AQBBQxhZG1pblB1YktleTEJAMwIAgkBC1N0cmluZ0VudHJ5AgUNa0FkbWluUHViS2V5MgkA2AQBBQxhZG1pblB1YktleTIJAMwIAgkBC1N0cmluZ0VudHJ5AgUNa0FkbWluUHViS2V5MwkA2AQBBQxhZG1pblB1YktleTMJAMwIAgkBC1N0cmluZ0VudHJ5AgUSa0FkbWluSW52b2tlUHViS2V5CQDYBAEFEWFkbWluUHViS2V5SW52b2tlBQNuaWwBaQEHYWRkUG9vbAILcG9vbEFkZHJlc3MIcG9vbE5hbWUJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQQdmFsaWRhdGVkQWRkcmVzcwkBEWdldEFkZHJlc3NJZlZhbGlkAQULcG9vbEFkZHJlc3MEB2tleU5hbWUJAKwCAgUPa1ByZWZpeFBvb2xOYW1lBRB2YWxpZGF0ZWRBZGRyZXNzBBhwb3NzaWJseUFscmVhZHlBZGRlZFBvb2wJAJ0IAgUEdGhpcwUHa2V5TmFtZQMJAQlpc0RlZmluZWQBBRhwb3NzaWJseUFscmVhZHlBZGRlZFBvb2wJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICE1Bvb2wgd2l0aCBhZGRyZXNzICIFEHZhbGlkYXRlZEFkZHJlc3MCICIgaXMgYWxyZWFkeSBkZWZpbmVkIHdpdGggbmFtZSAiCQEFdmFsdWUBBRhwb3NzaWJseUFscmVhZHlBZGRlZFBvb2wCASIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQdrZXlOYW1lCQESZ2V0UG9vbE5hbWVJZlZhbGlkAQUIcG9vbE5hbWUFA25pbAMJAAACCQELZ2V0UG9vbFR5cGUBCQEFdmFsdWUBCQCmCAEFC3Bvb2xBZGRyZXNzAgptdWx0eWN1cnZlBQNuaWwECGFzc2V0SWRBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBBXZhbHVlAQkApggBBQtwb29sQWRkcmVzcwUJa0Fzc2V0SWRBAhdBc3NldCBpZCBBIGlzIGluY29ycmVjdAQIYXNzZXRJZEIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEFdmFsdWUBCQCmCAEFC3Bvb2xBZGRyZXNzBQlrQXNzZXRJZEICF0Fzc2V0IGlkIEIgaXMgaW5jb3JyZWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBWtQYWlyBQhhc3NldElkQQIBXwUIYXNzZXRJZEIFC3Bvb2xBZGRyZXNzBQNuaWwBaQEKcmVuYW1lUG9vbAILcG9vbEFkZHJlc3MLbmV3UG9vbE5hbWUJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQQdmFsaWRhdGVkQWRkcmVzcwkBEWdldEFkZHJlc3NJZlZhbGlkAQULcG9vbEFkZHJlc3MEB2tleU5hbWUJAKwCAgUPa1ByZWZpeFBvb2xOYW1lBRB2YWxpZGF0ZWRBZGRyZXNzBBhwb3NzaWJseUFscmVhZHlBZGRlZFBvb2wJAJ0IAgUEdGhpcwUHa2V5TmFtZQMJAQlpc0RlZmluZWQBBRhwb3NzaWJseUFscmVhZHlBZGRlZFBvb2wJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa2V5TmFtZQkBEmdldFBvb2xOYW1lSWZWYWxpZAEFC25ld1Bvb2xOYW1lBQNuaWwJAAIBCQCsAgIJAKwCAgITUG9vbCB3aXRoIGFkZHJlc3MgIgUQdmFsaWRhdGVkQWRkcmVzcwIYIiBoYXMgbm90IHlldCBiZWVuIGFkZGVkAWkBHmxhdW5jaHBhZERhdGFUcmFuc2FjdGlvblN0YXR1cwEGc3RhdHVzCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkJAMwIAgkBDEJvb2xlYW5FbnRyeQIFH2tMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMFBnN0YXR1cwUDbmlsAWkBFWFkZEFjaGlldmVtZW50c1dyaXRlcgEHYWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpBAd3cml0ZXJzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFFGtBY2hpZXZlbWVudHNXcml0ZXJzAgAEBGRhdGEDCQAAAgUHd3JpdGVycwIABQNuaWwJALUJAgUHd3JpdGVycwIBLAkAzAgCCQELU3RyaW5nRW50cnkCBRRrQWNoaWV2ZW1lbnRzV3JpdGVycwkAuQkCCQDNCAIFBGRhdGEFB2FkZHJlc3MCASwFA25pbAFpARhyZW1vdmVBY2hpZXZlbWVudHNXcml0ZXIBB2FkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQHd3JpdGVycwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFFGtBY2hpZXZlbWVudHNXcml0ZXJzAgACASwEBWluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUHd3JpdGVycwUHYWRkcmVzcwIeQ2FuJ3QgZmluZCBhZGRyZXNzIGluIHRoZSBsaXN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtBY2hpZXZlbWVudHNXcml0ZXJzCQC5CQIJANEIAgUHd3JpdGVycwUFaW5kZXgCASwFA25pbAECdHgBBnZlcmlmeQAEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAEDXNpZ25lZEJ5QWRtaW4JAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQac2lnbmVkQnlBZG1pblRvQ2FsbEFkZFBvb2wJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAQQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQWaXNTZWxmSW52b2tlUmVuYW1lUG9vbAMJAAACCAUDaW52BGRBcHAFBHRoaXMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICCnJlbmFtZVBvb2wFA25pbAgFA2ludghmdW5jdGlvbgcEFGlzU2VsZkludm9rZVNldEFkbWluAwkAAAIIBQNpbnYEZEFwcAUEdGhpcwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIIc2V0QWRtaW4FA25pbAgFA2ludghmdW5jdGlvbgcEE2lzU2VsZkludm9rZUFkZFBvb2wDCQAAAggFA2ludgRkQXBwBQR0aGlzCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdhZGRQb29sBQNuaWwIBQNpbnYIZnVuY3Rpb24HBCFpc1NlbGZJbnZva2VMYXVuY2hwYWREYXRhVHhTdGF0dXMDCQAAAggFA2ludgRkQXBwBQR0aGlzCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAh5sYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMFA25pbAgFA2ludghmdW5jdGlvbgcEIWlzU2VsZkludm9rZUFkZEFjaGlldmVtZW50c1dyaXRlcgMJAAACCAUDaW52BGRBcHAFBHRoaXMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICFWFkZEFjaGlldmVtZW50c1dyaXRlcgUDbmlsCAUDaW52CGZ1bmN0aW9uBwQkaXNTZWxmSW52b2tlUmVtb3ZlQWNoaWV2ZW1lbnRzV3JpdGVyAwkAAAIIBQNpbnYEZEFwcAUEdGhpcwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIYcmVtb3ZlQWNoaWV2ZW1lbnRzV3JpdGVyBQNuaWwIBQNpbnYIZnVuY3Rpb24HAwMDAwMDAwUNc2lnbmVkQnlBZG1pbgkAAAIJAJADAQgFA2ludghwYXltZW50cwAABwUWaXNTZWxmSW52b2tlUmVuYW1lUG9vbAcGAwMFGnNpZ25lZEJ5QWRtaW5Ub0NhbGxBZGRQb29sCQAAAgkAkAMBCAUDaW52CHBheW1lbnRzAAAHBRNpc1NlbGZJbnZva2VBZGRQb29sBwYDAwUNc2lnbmVkQnlBZG1pbgkAAAIJAJADAQgFA2ludghwYXltZW50cwAABwUUaXNTZWxmSW52b2tlU2V0QWRtaW4HBgMDBQ1zaWduZWRCeUFkbWluCQAAAgkAkAMBCAUDaW52CHBheW1lbnRzAAAHBSFpc1NlbGZJbnZva2VMYXVuY2hwYWREYXRhVHhTdGF0dXMHBgMDBQ1zaWduZWRCeUFkbWluCQAAAgkAkAMBCAUDaW52CHBheW1lbnRzAAAHBSFpc1NlbGZJbnZva2VBZGRBY2hpZXZlbWVudHNXcml0ZXIHBgMDBQ1zaWduZWRCeUFkbWluCQAAAgkAkAMBCAUDaW52CHBheW1lbnRzAAAHBSRpc1NlbGZJbnZva2VSZW1vdmVBY2hpZXZlbWVudHNXcml0ZXIHAwMJAAECBQckbWF0Y2gwAgVPcmRlcgYDCQABAgUHJG1hdGNoMAIPRGF0YVRyYW5zYWN0aW9uBgMJAAECBQckbWF0Y2gwAhVTcG9uc29yRmVlVHJhbnNhY3Rpb24GAwkAAQIFByRtYXRjaDACFFNldFNjcmlwdFRyYW5zYWN0aW9uBgMJAAECBQckbWF0Y2gwAhZDcmVhdGVBbGlhc1RyYW5zYWN0aW9uBgMJAAECBQckbWF0Y2gwAhZMZWFzZUNhbmNlbFRyYW5zYWN0aW9uBgMJAAECBQckbWF0Y2gwAhBMZWFzZVRyYW5zYWN0aW9uBgMJAAECBQckbWF0Y2gwAhBJc3N1ZVRyYW5zYWN0aW9uBgMJAAECBQckbWF0Y2gwAhtJbnZva2VFeHByZXNzaW9uVHJhbnNhY3Rpb24GAwkAAQIFByRtYXRjaDACGlVwZGF0ZUFzc2V0SW5mb1RyYW5zYWN0aW9uBgMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgYDCQABAgUHJG1hdGNoMAIZU2V0QXNzZXRTY3JpcHRUcmFuc2FjdGlvbgYDCQABAgUHJG1hdGNoMAITVHJhbnNmZXJUcmFuc2FjdGlvbgYDCQABAgUHJG1hdGNoMAITRXhjaGFuZ2VUcmFuc2FjdGlvbgYDCQABAgUHJG1hdGNoMAIXTWFzc1RyYW5zZmVyVHJhbnNhY3Rpb24GAwkAAQIFByRtYXRjaDACD0J1cm5UcmFuc2FjdGlvbgYJAAECBQckbWF0Y2gwAhJSZWlzc3VlVHJhbnNhY3Rpb24FDXNpZ25lZEJ5QWRtaW4JAAIBAgtNYXRjaCBlcnJvchKHEKA=", "height": 2209983, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2RTCA7ce4hGguWW1VfsS7BeVt2SRsFc3j6ELKb5q42XR Next: 3UVsrMNfPVpEWMPfpTjD4vUcaeNo5EP1YgCKYSyBzG3Z Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let kPoolsListName = "pools"
5-
64 let kPrefixPoolName = "pool_"
7-
8-let kPrefixPoolIndex = "index_"
95
106 let kPair = "pair_"
117
3329
3430 let adminPubKeyInvoke = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
3531
36-let pools = match getString(this, kPoolsListName) {
37- case string: String =>
38- split(string, ",")
39- case nothing =>
40- nil
41-}
42-
4332 func isSelfCall (i) = if ((i.caller == this))
4433 then unit
4534 else throw("Only the Oracle itself can invoke this function")
5948 }
6049
6150
51+func getPoolType (poolAddress) = {
52+ let version = valueOrErrorMessage(getString(poolAddress, "version"), "Pool is not initialized")
53+ if ((version == "1.0.0"))
54+ then "cpmm"
55+ else if ((version == "2.0.0"))
56+ then "flat"
57+ else if ((version == "3.0.0"))
58+ then "multycurve"
59+ else throw("Unknown version of pool")
60+ }
61+
62+
6263 func getAddressIfValid (address) = toString(valueOrErrorMessage(addressFromString(address), (("Can't parse \"" + address) + "\" as address")))
6364
6465
7172 func addPool (poolAddress,poolName) = valueOrElse(isSelfCall(i), {
7273 let validatedAddress = getAddressIfValid(poolAddress)
7374 let keyName = (kPrefixPoolName + validatedAddress)
74- let keyIndex = (kPrefixPoolIndex + validatedAddress)
75- let assetIdA = valueOrErrorMessage(getString(value(addressFromString(poolAddress)), kAssetIdA), "Asset id A is incorrect")
76- let assetIdB = valueOrErrorMessage(getString(value(addressFromString(poolAddress)), kAssetIdB), "Asset id B is incorrect")
7775 let possiblyAlreadyAddedPool = getString(this, keyName)
7876 if (isDefined(possiblyAlreadyAddedPool))
7977 then throw((((("Pool with address \"" + validatedAddress) + "\" is already defined with name \"") + value(possiblyAlreadyAddedPool)) + "\""))
80- else [IntegerEntry(keyIndex, size(pools)), StringEntry(keyName, getPoolNameIfValid(poolName)), StringEntry((((kPair + assetIdA) + "_") + assetIdB), poolAddress), StringEntry(kPoolsListName, makeString((pools :+ validatedAddress), ","))]
78+ else ([StringEntry(keyName, getPoolNameIfValid(poolName))] ++ (if ((getPoolType(value(addressFromString(poolAddress))) == "multycurve"))
79+ then nil
80+ else {
81+ let assetIdA = valueOrErrorMessage(getString(value(addressFromString(poolAddress)), kAssetIdA), "Asset id A is incorrect")
82+ let assetIdB = valueOrErrorMessage(getString(value(addressFromString(poolAddress)), kAssetIdB), "Asset id B is incorrect")
83+[StringEntry((((kPair + assetIdA) + "_") + assetIdB), poolAddress)]
84+ }))
8185 })
8286
8387
186190 else false)
187191 then isSelfInvokeRemoveAchievementsWriter
188192 else false
189- case _: Order|DataTransaction|SponsorFeeTransaction|SetScriptTransaction|CreateAliasTransaction|LeaseCancelTransaction|LeaseTransaction|IssueTransaction|UpdateAssetInfoTransaction|InvokeScriptTransaction|SetAssetScriptTransaction|TransferTransaction|ExchangeTransaction|MassTransferTransaction|BurnTransaction|ReissueTransaction =>
193+ case _: Order|DataTransaction|SponsorFeeTransaction|SetScriptTransaction|CreateAliasTransaction|LeaseCancelTransaction|LeaseTransaction|IssueTransaction|InvokeExpressionTransaction|UpdateAssetInfoTransaction|InvokeScriptTransaction|SetAssetScriptTransaction|TransferTransaction|ExchangeTransaction|MassTransferTransaction|BurnTransaction|ReissueTransaction =>
190194 signedByAdmin
191195 case _ =>
192196 throw("Match error")
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let kPoolsListName = "pools"
5-
64 let kPrefixPoolName = "pool_"
7-
8-let kPrefixPoolIndex = "index_"
95
106 let kPair = "pair_"
117
128 let kAssetIdA = "A_asset_id"
139
1410 let kAssetIdB = "B_asset_id"
1511
1612 let kLaunchpadDataTransactionStatus = "launchpad_data_transaction_status"
1713
1814 let kAdminPubKey1 = "admin_pub_1"
1915
2016 let kAdminPubKey2 = "admin_pub_2"
2117
2218 let kAdminPubKey3 = "admin_pub_3"
2319
2420 let kAdminInvokePubKey = "admin_invoke_pub"
2521
2622 let kAchievementsWriters = "achievements_writers"
2723
2824 let adminPubKey1 = base58'GFmKZ2naZFRoCvNbwKAQVGmLb1uBeWGDgFabdGBuZiuy'
2925
3026 let adminPubKey2 = base58'GmJXRyhRA79g8yUGgKBAVdnFfQFDMjQG98b1MmLDh5kk'
3127
3228 let adminPubKey3 = base58'CFhbV6h41hVjbGHudGtS3fYUv7QAKRxFQzKNtx4B5PqP'
3329
3430 let adminPubKeyInvoke = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
3531
36-let pools = match getString(this, kPoolsListName) {
37- case string: String =>
38- split(string, ",")
39- case nothing =>
40- nil
41-}
42-
4332 func isSelfCall (i) = if ((i.caller == this))
4433 then unit
4534 else throw("Only the Oracle itself can invoke this function")
4635
4736
4837 func getPoolNameIfValid (poolName) = {
4938 let underscoreIndex = valueOrElse(indexOf(poolName, "_"), -1)
5039 let underscoreLastIndex = valueOrElse(lastIndexOf(poolName, "_"), -1)
5140 let hasSingleUnderscore = if (if ((underscoreIndex == underscoreLastIndex))
5241 then (underscoreIndex > 0)
5342 else false)
5443 then (underscoreIndex != (size(poolName) - 1))
5544 else false
5645 if (hasSingleUnderscore)
5746 then poolName
5847 else throw("Pool name must consist of two asset names separated by an underscore character")
5948 }
6049
6150
51+func getPoolType (poolAddress) = {
52+ let version = valueOrErrorMessage(getString(poolAddress, "version"), "Pool is not initialized")
53+ if ((version == "1.0.0"))
54+ then "cpmm"
55+ else if ((version == "2.0.0"))
56+ then "flat"
57+ else if ((version == "3.0.0"))
58+ then "multycurve"
59+ else throw("Unknown version of pool")
60+ }
61+
62+
6263 func getAddressIfValid (address) = toString(valueOrErrorMessage(addressFromString(address), (("Can't parse \"" + address) + "\" as address")))
6364
6465
6566 @Callable(i)
6667 func setAdmin () = valueOrElse(isSelfCall(i), [StringEntry(kAdminPubKey1, toBase58String(adminPubKey1)), StringEntry(kAdminPubKey2, toBase58String(adminPubKey2)), StringEntry(kAdminPubKey3, toBase58String(adminPubKey3)), StringEntry(kAdminInvokePubKey, toBase58String(adminPubKeyInvoke))])
6768
6869
6970
7071 @Callable(i)
7172 func addPool (poolAddress,poolName) = valueOrElse(isSelfCall(i), {
7273 let validatedAddress = getAddressIfValid(poolAddress)
7374 let keyName = (kPrefixPoolName + validatedAddress)
74- let keyIndex = (kPrefixPoolIndex + validatedAddress)
75- let assetIdA = valueOrErrorMessage(getString(value(addressFromString(poolAddress)), kAssetIdA), "Asset id A is incorrect")
76- let assetIdB = valueOrErrorMessage(getString(value(addressFromString(poolAddress)), kAssetIdB), "Asset id B is incorrect")
7775 let possiblyAlreadyAddedPool = getString(this, keyName)
7876 if (isDefined(possiblyAlreadyAddedPool))
7977 then throw((((("Pool with address \"" + validatedAddress) + "\" is already defined with name \"") + value(possiblyAlreadyAddedPool)) + "\""))
80- else [IntegerEntry(keyIndex, size(pools)), StringEntry(keyName, getPoolNameIfValid(poolName)), StringEntry((((kPair + assetIdA) + "_") + assetIdB), poolAddress), StringEntry(kPoolsListName, makeString((pools :+ validatedAddress), ","))]
78+ else ([StringEntry(keyName, getPoolNameIfValid(poolName))] ++ (if ((getPoolType(value(addressFromString(poolAddress))) == "multycurve"))
79+ then nil
80+ else {
81+ let assetIdA = valueOrErrorMessage(getString(value(addressFromString(poolAddress)), kAssetIdA), "Asset id A is incorrect")
82+ let assetIdB = valueOrErrorMessage(getString(value(addressFromString(poolAddress)), kAssetIdB), "Asset id B is incorrect")
83+[StringEntry((((kPair + assetIdA) + "_") + assetIdB), poolAddress)]
84+ }))
8185 })
8286
8387
8488
8589 @Callable(i)
8690 func renamePool (poolAddress,newPoolName) = valueOrElse(isSelfCall(i), {
8791 let validatedAddress = getAddressIfValid(poolAddress)
8892 let keyName = (kPrefixPoolName + validatedAddress)
8993 let possiblyAlreadyAddedPool = getString(this, keyName)
9094 if (isDefined(possiblyAlreadyAddedPool))
9195 then [StringEntry(keyName, getPoolNameIfValid(newPoolName))]
9296 else throw((("Pool with address \"" + validatedAddress) + "\" has not yet been added"))
9397 })
9498
9599
96100
97101 @Callable(i)
98102 func launchpadDataTransactionStatus (status) = valueOrElse(isSelfCall(i), [BooleanEntry(kLaunchpadDataTransactionStatus, status)])
99103
100104
101105
102106 @Callable(i)
103107 func addAchievementsWriter (address) = valueOrElse(isSelfCall(i), {
104108 let writers = valueOrElse(getString(this, kAchievementsWriters), "")
105109 let data = if ((writers == ""))
106110 then nil
107111 else split(writers, ",")
108112 [StringEntry(kAchievementsWriters, makeString((data :+ address), ","))]
109113 })
110114
111115
112116
113117 @Callable(i)
114118 func removeAchievementsWriter (address) = valueOrElse(isSelfCall(i), {
115119 let writers = split(valueOrElse(getString(this, kAchievementsWriters), ""), ",")
116120 let index = valueOrErrorMessage(indexOf(writers, address), "Can't find address in the list")
117121 [StringEntry(kAchievementsWriters, makeString(removeByIndex(writers, index), ","))]
118122 })
119123
120124
121125 @Verifier(tx)
122126 func verify () = {
123127 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
124128 then 1
125129 else 0
126130 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
127131 then 1
128132 else 0
129133 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
130134 then 1
131135 else 0
132136 let signedByAdmin = (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
133137 let signedByAdminToCallAddPool = (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 1)
134138 match tx {
135139 case inv: InvokeScriptTransaction =>
136140 let isSelfInvokeRenamePool = if ((inv.dApp == this))
137141 then containsElement(["renamePool"], inv.function)
138142 else false
139143 let isSelfInvokeSetAdmin = if ((inv.dApp == this))
140144 then containsElement(["setAdmin"], inv.function)
141145 else false
142146 let isSelfInvokeAddPool = if ((inv.dApp == this))
143147 then containsElement(["addPool"], inv.function)
144148 else false
145149 let isSelfInvokeLaunchpadDataTxStatus = if ((inv.dApp == this))
146150 then containsElement(["launchpadDataTransactionStatus"], inv.function)
147151 else false
148152 let isSelfInvokeAddAchievementsWriter = if ((inv.dApp == this))
149153 then containsElement(["addAchievementsWriter"], inv.function)
150154 else false
151155 let isSelfInvokeRemoveAchievementsWriter = if ((inv.dApp == this))
152156 then containsElement(["removeAchievementsWriter"], inv.function)
153157 else false
154158 if (if (if (if (if (if (if (signedByAdmin)
155159 then (size(inv.payments) == 0)
156160 else false)
157161 then isSelfInvokeRenamePool
158162 else false)
159163 then true
160164 else if (if (signedByAdminToCallAddPool)
161165 then (size(inv.payments) == 0)
162166 else false)
163167 then isSelfInvokeAddPool
164168 else false)
165169 then true
166170 else if (if (signedByAdmin)
167171 then (size(inv.payments) == 0)
168172 else false)
169173 then isSelfInvokeSetAdmin
170174 else false)
171175 then true
172176 else if (if (signedByAdmin)
173177 then (size(inv.payments) == 0)
174178 else false)
175179 then isSelfInvokeLaunchpadDataTxStatus
176180 else false)
177181 then true
178182 else if (if (signedByAdmin)
179183 then (size(inv.payments) == 0)
180184 else false)
181185 then isSelfInvokeAddAchievementsWriter
182186 else false)
183187 then true
184188 else if (if (signedByAdmin)
185189 then (size(inv.payments) == 0)
186190 else false)
187191 then isSelfInvokeRemoveAchievementsWriter
188192 else false
189- case _: Order|DataTransaction|SponsorFeeTransaction|SetScriptTransaction|CreateAliasTransaction|LeaseCancelTransaction|LeaseTransaction|IssueTransaction|UpdateAssetInfoTransaction|InvokeScriptTransaction|SetAssetScriptTransaction|TransferTransaction|ExchangeTransaction|MassTransferTransaction|BurnTransaction|ReissueTransaction =>
193+ case _: Order|DataTransaction|SponsorFeeTransaction|SetScriptTransaction|CreateAliasTransaction|LeaseCancelTransaction|LeaseTransaction|IssueTransaction|InvokeExpressionTransaction|UpdateAssetInfoTransaction|InvokeScriptTransaction|SetAssetScriptTransaction|TransferTransaction|ExchangeTransaction|MassTransferTransaction|BurnTransaction|ReissueTransaction =>
190194 signedByAdmin
191195 case _ =>
192196 throw("Match error")
193197 }
194198 }
195199

github/deemru/w8io/873ac7e 
50.10 ms