tx · DE3bJA9TFCcmbVxpXUzsxK8TS2UgBG3wV1gc8ANGjBU1 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep: -0.01500000 Waves 2023.03.11 20:17 [2485677] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves
{ "type": 13, "id": "DE3bJA9TFCcmbVxpXUzsxK8TS2UgBG3wV1gc8ANGjBU1", "fee": 1500000, "feeAssetId": null, "timestamp": 1678555048146, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "61LPZKyGxp6K5nbW2vTJe9K2V4faNtJNH9RjBZ7bN8uEYjpVdjdTy6msqLRbZkwZRBCQ98GzLkWo3QnMkZhoq1WH" ], "script": "base64:BgIfCAISAwoBCBIECgIRERIECgIRERIDCgEREgUKAwEBATQAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAGTVVMVDEwAIDIr6AlAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkbkFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRAwkAAAIBAVQFByRtYXRjaDABIPd26vf3g8pl224T7gI7z1gplanB0Y3yS9ps2B1igMjeCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQARSWR4Q2ZnRWNvbm9teURhcHAAAgAUSWR4Q2ZnR292ZXJuYW5jZURhcHAAAwEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EABk5VTVJFUwAGABNGQUNUT1JZTUFYV0FSRUhPVVNFAIDIr6AlABBSRVNPVVJDRVBSSUNFTUlOANXWCQAKTUlOUEFZTUVOVACQTgAOU0VMTE1VTFRJUExJRVIAyAEADUJVWU1VTFRJUExJRVIArAIACHJlc1R5cGVzCQDMCAICA09pbAkAzAgCAgNPcmUJAMwIAgIEV29vZAkAzAgCAgRTYW5kCQDMCAICBENsYXkJAMwIAgIHT3JnYW5pYwUDbmlsAAhtYXRUeXBlcwkAzAgCAgRGdWVsCQDMCAICBU1ldGFsCQDMCAICBVBsYW5rCQDMCAICBUdsYXNzCQDMCAICB1BsYXN0aWMJAMwIAgIHUHJvdGVpbgUDbmlsAApjb250aW5lbnRzCQDMCAICCEFtZXJpY2FzCQDMCAICBkV1cm9wZQkAzAgCAgRBc2lhCQDMCAICBkFmcmljYQkAzAgCAgdPY2VhbmlhBQNuaWwAEHByb2R1Y3Rpb25NYXRyaXgJAMwIAgIQMV8xXzFfMl8yXzVfMV8xMAkAzAgCAhEyXzVfNV8yXzdfNV8yXzEwMAkAzAgCAhAxXzFfMV8yXzJfNV8xXzEwCQDMCAICETlfOV8xXzVfNV8xXzVfMTAwCQDMCAICETFfNV8xXzVfNV8xXzFfMTAwBQNuaWwAD2NvbnRJZHhBbWVyaWNhcwAAAA1jb250SWR4RXVyb3BlAAEAC2NvbnRJZHhBc2lhAAIADWNvbnRJZHhBZnJpY2EAAwAOY29udElkeE9jZWFuaWEABAEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAglmYWN0b3J5SWQHcmVzVHlwZQkArAICCQCsAgIJAKwCAgIbZmFjdG9yeVdoQnlDb250aW5lbnRBbmRSZXNfBQlmYWN0b3J5SWQCAV8JAKQDAQUHcmVzVHlwZQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgERa2V5QmFja3BhY2tCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICCWJhY2tQYWNrXwULZHVja0Fzc2V0SWQBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkAA9sb2NJZHhDb250aW5lbnQAAAAKbG9jSWR4VHlwZQABAAhsb2NJZHhJZAACAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBDHNlbGxJbnRlcm5hbAQFbG9jSWQHcmVzVHlwZQZhbW91bnQIbWluUHJpY2UEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFB3Jlc1R5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAnIwAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFAAADCQBmAgkAZAIFAncwBQZhbW91bnQFE0ZBQ1RPUllNQVhXQVJFSE9VU0UJAGUCBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQJ3MAUGYW1vdW50BAx1c2RuUmVjZWl2ZWQJAGQCCQBrAwUCcjAJAGUCCQBoAgUOU0VMTE1VTFRJUExJRVIFEFJFU09VUkNFUFJJQ0VNSU4JAGsDCQBkAgkAaAIAZAUCdzAJAGgCADIFAnIwBRBSRVNPVVJDRVBSSUNFTUlOBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQZNVUxUMTAJAGsDCQBlAgUGYW1vdW50BQJyMAUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgEBW1pbjk5CQBlAgUIbWluUHJpY2UJAGkCBQhtaW5QcmljZQBkAwkAZgIJAGgCBQVtaW45OQUGYW1vdW50CQBoAgUMdXNkblJlY2VpdmVkBQVNVUxUOAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQWN0dWFsIHByaWNlID0gCQCkAwEFDHVzZG5SZWNlaXZlZAIDIC8gCQCkAwEFBmFtb3VudAIOIDwgbWluUHJpY2UgPSAJAKQDAQUIbWluUHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCHJlc1R5cGVzBQdyZXNUeXBlAgEpCQCUCgIJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZAIFAncwBQZhbW91bnQFDHVzZG5SZWNlaXZlZAELYnV5SW50ZXJuYWwEBWxvY0lkB21hdFR5cGUGYW1vdW50CG1heFByaWNlBAV3aEtleQkBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIFBWxvY0lkBQdtYXRUeXBlBAJ3MAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV3aEtleQAABAJtMQMJAGYCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQkAlwMBCQDMCAIFBmFtb3VudAkAzAgCCQBlAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UFA25pbAAABAJtMAkAlwMBCQDMCAIFAncwCQDMCAIJAGUCBQZhbW91bnQFAm0xBQNuaWwEAW0JAGQCBQJtMAUCbTEECXVzZG5TcGVudAkAZAIJAGsDBQJtMAkAZQIJAGgCBQ1CVVlNVUxUSVBMSUVSBRBSRVNPVVJDRVBSSUNFTUlOCQBrAwkAZQIJAGgCAGQFAncwCQBoAgAyBQJtMAUQUkVTT1VSQ0VQUklDRU1JTgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUGTVVMVDEwCQBrAwUCbTEJAGgCAAIFEFJFU09VUkNFUFJJQ0VNSU4FBU1VTFQ4BAZtYXgxMDEJAGQCBQhtYXhQcmljZQkAaQIFCG1heFByaWNlAGQDCQBmAgkAaAIFCXVzZG5TcGVudAUFTVVMVDgJAGgCBQZtYXgxMDEFAW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0FjdHVhbCBwcmljZSA9IAkApAMBBQl1c2RuU3BlbnQCAyAvIAkApAMBBQFtAg4gPiBtYXhQcmljZSA9IAkApAMBBQhtYXhQcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIbWF0VHlwZXMFB21hdFR5cGUCASkJAJUKAwkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBlAgUCdzAFAW0FCXVzZG5TcGVudAUBbQELZ2V0QmFja3BhY2sBBWJwS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQVicEtleQIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToJAMwIAgkApAMBCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUBcAUKYnBJZHhMZXZlbAAACQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeFJlcwILMF8wXzBfMF8wXzAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAXAFCWJwSWR4UHJvZAUDbmlsAQxjaGVja0Jsb2NrZWQAAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ9zdGFraW5nQ29udHJhY3QJAQprZXlCbG9ja2VkAAcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlBQR1bml0BQFpAQ1jb25zdHJ1Y3RvclYxAQhyZXN0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyBQNuaWwBaQENc2VsbFJlc291cmNlcwIHYW1vdW50cwltaW5QcmljZXMEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECKnNlbGxSZXNvdXJjZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwoBBWFkZGVyAgNhY2MBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkAkQMCBQdyZXNMaXN0BQFqAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhQsIGJ1dCB0cmllZCB0byBzZWxsIAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiVZb3UgdHJpZWQgdG8gc2VsbCBuZWdhdGl2ZSBhbW91bnQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAgI6IAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqAAAEAWIJAQxzZWxsSW50ZXJuYWwEBQVsb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1pblByaWNlcwUBagkAlQoDCQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQCRAwIFB2Ftb3VudHMFAWoJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHcmVzTGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwJAJQKAgkAzQgCCAUGbWVyZ2VkAl8xCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIIBQZtZXJnZWQCXzMFC3VzZG5Bc3NldElkBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMYnV5TWF0ZXJpYWxzAgdhbW91bnRzCW1heFByaWNlcwQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2RuQXNzZXRJZAkAAgECE1VTRE4gcGF5bWVudHMgb25seSEEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFbG9jSWQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8KAQhtVXBkYXRlcgIDYWNjAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiRZb3UgdHJpZWQgdG8gYnV5IG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIbWF0VHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBC2J1eUludGVybmFsBAUFbG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltYXhQcmljZXMFAWoJAJUKAwkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBaggFAWICXzMJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHbWF0TGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIbVVwZGF0ZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAgFBm1lcmdlZAJfMwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAgFBm1lcmdlZAJfMwULdXNkbkFzc2V0SWQFA25pbAUDbmlsCQCUCgIJAM4IAggFBm1lcmdlZAJfMQUEcmVzdAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWV4Y2hhbmdlUmVzb3VyY2VzAQdhbW91bnRzBAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZG5Bc3NldElkCQACAQITVVNETiBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwoBCWV4Y2hhbmdlcgIDYWNjAWoEA2FtagkAkQMCBQdhbW91bnRzBQFqAwkAZgIFA2FtagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCGCwgYnV0IHRyaWVkIHRvIGV4Y2hhbmdlIAkApAMBBQNhbWoDCQBmAgAABQNhbWoJAAIBCQCsAgIJAKwCAgkArAICAilZb3UgdHJpZWQgdG8gZXhjaGFuZ2UgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhyZXNUeXBlcwUBagICOiAJAKQDAQUDYW1qAwkAZgIFA2FtagAACQCVCgMJAM0IAggFA2FjYwJfMQkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoFA2FtagkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBagUDYW1qCQBkAggFA2FjYwJfMwkAawMFA2FtagUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgJAJUKAwkAzQgCCAUDYWNjAl8xCQCRAwIFB3Jlc0xpc3QFAWoJAM0IAggFA2FjYwJfMgkAkQMCBQdtYXRMaXN0BQFqCAUDYWNjAl8zBAZtZXJnZWQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlleGNoYW5nZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFBm1lcmdlZAJfMQIBXwkAzAgCCQC5CQIIBQZtZXJnZWQCXzICAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQIBQZtZXJnZWQCXzMAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQIBQZtZXJnZWQCXzMFC3VzZG5Bc3NldElkBQNuaWwFA25pbAkAlAoCBQRyZXN0BQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIYnV5R29vZHMDCnByb2R1Y3RJZHgFbGV2ZWwIcXVhbnRpdHkEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiVidXlHb29kcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzAwkAZgIAAAUIcXVhbnRpdHkJAAIBAhtRdWFudGl0eSBzaG91bGQgYmUgcG9zaXRpdmUEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBTQkAAgEJAKwCAgIxRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBNYW51ZmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQEY29udAkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8DAwkAZgIAAAUKcHJvZHVjdElkeAYJAGcCBQpwcm9kdWN0SWR4CQCQAwEFEHByb2R1Y3Rpb25NYXRyaXgJAAIBCQCsAgICFFVua25vd24gcHJvZHVjdCBpZHg9CQCkAwEFCnByb2R1Y3RJZHgEDnByb2R1Y3RDb250SWR4CQBqAgUKcHJvZHVjdElkeAkAkAMBBQpjb250aW5lbnRzAwkBAiE9AgkAkQMCBQpjb250aW5lbnRzBQ5wcm9kdWN0Q29udElkeAUEY29udAkAAgEJAKwCAgkArAICCQCsAgICHVRoaXMgcHJvZHVjdCBpcyBhdmFpbGFibGUgaW4gCQCRAwIFCmNvbnRpbmVudHMFDnByb2R1Y3RDb250SWR4AhEsIGJ1dCB5b3UgYXJlIGluIAUEY29udAQGcmVjaXBlCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUKcHJvZHVjdElkeAIBXwMJAQIhPQIJAJADAQUGcmVjaXBlCQBkAgUGTlVNUkVTAAIJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgECHByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfCgEGZmlsbGVyAgNhY2MLaWdub3JlZEl0ZW0EAW4IBQNhY2MCXzIEAXgDCQBmAgkAkAMBBQhwcm9kTGlzdAUBbgkAtQkCCQCRAwIFCHByb2RMaXN0BQFuAgEsCQDMCAICATAJAMwIAgIBMAkAzAgCAgEwBQNuaWwEA3gxcwkAkQMCBQF4AAAEAngxCQENcGFyc2VJbnRWYWx1ZQEFA3gxcwQDeDJzCQCRAwIFAXgAAQQCeDIJAQ1wYXJzZUludFZhbHVlAQUDeDJzBAN4M3MJAJEDAgUBeAACBAJ4MwkBDXBhcnNlSW50VmFsdWUBBQN4M3MEBmFtb3VudAkAaAIFCHF1YW50aXR5CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlAAcEAXkDCQAAAgUBbgUKcHJvZHVjdElkeAQHJG1hdGNoMAUFbGV2ZWwDCQAAAgABBQckbWF0Y2gwCQCsAgIJAKwCAgkArAICCQCsAgIJAKQDAQkAZAIFAngxBQZhbW91bnQCASwFA3gycwIBLAUDeDNzAwkAAAIAAgUHJG1hdGNoMAkArAICCQCsAgIJAKwCAgkArAICBQN4MXMCASwJAKQDAQkAZAIFAngyBQZhbW91bnQCASwFA3gzcwMJAAACAAMFByRtYXRjaDAJAKwCAgkArAICCQCsAgIJAKwCAgUDeDFzAgEsBQN4MnMCASwJAKQDAQkA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", "height": 2485677, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9jUFdyBNDLwr3Gw1evnj8T7NsMLTWo5ALvFVF977EQyw Next: 3CTDd6Tytfs6LAuQn8YA8CYMeXDDaPEq1ob7pPC9kWtj Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let SEP = "__" | |
5 | + | ||
4 | 6 | let MULT6 = 1000000 | |
5 | 7 | ||
6 | 8 | let MULT8 = 100000000 | |
18 | 20 | else throw("Unknown chain") | |
19 | 21 | } | |
20 | 22 | ||
21 | - | let | |
23 | + | let defaultRestAddressStr = match chain { | |
22 | 24 | case _ => | |
23 | 25 | if ((base58'2W' == $match0)) | |
24 | - | then " | |
26 | + | then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv" | |
25 | 27 | else if ((base58'2T' == $match0)) | |
26 | - | then " | |
28 | + | then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy" | |
27 | 29 | else throw("Unknown chain") | |
28 | - | }) | |
30 | + | } | |
31 | + | ||
32 | + | func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")) | |
33 | + | ||
34 | + | ||
35 | + | func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal) | |
36 | + | ||
37 | + | ||
38 | + | let IdxCfgStakingDapp = 1 | |
39 | + | ||
40 | + | let IdxCfgEconomyDapp = 2 | |
41 | + | ||
42 | + | let IdxCfgGovernanceDapp = 3 | |
43 | + | ||
44 | + | func keyRestCfg () = "%s__restConfig" | |
45 | + | ||
46 | + | ||
47 | + | func keyRestAddress () = "%s__restAddr" | |
48 | + | ||
49 | + | ||
50 | + | func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP) | |
51 | + | ||
52 | + | ||
53 | + | func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx))) | |
54 | + | ||
55 | + | ||
56 | + | let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr)) | |
57 | + | ||
58 | + | let restCfg = readRestCfgOrFail(restContract) | |
59 | + | ||
60 | + | let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp) | |
29 | 61 | ||
30 | 62 | let DEFAULTLOCATION = "Africa_F_Africa" | |
31 | 63 | ||
144 | 176 | ||
145 | 177 | ||
146 | 178 | @Callable(i) | |
179 | + | func constructorV1 (restAddr) = if ((i.caller != this)) | |
180 | + | then throw("Permission denied") | |
181 | + | else [StringEntry(keyRestAddress(), restAddr)] | |
182 | + | ||
183 | + | ||
184 | + | ||
185 | + | @Callable(i) | |
147 | 186 | func sellResources (amounts,minPrices) = { | |
148 | 187 | let blocked = checkBlocked() | |
149 | 188 | if ((blocked == blocked)) | |
249 | 288 | then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)] | |
250 | 289 | else nil | |
251 | 290 | $Tuple2((merged._1 ++ rest), result) | |
291 | + | } | |
292 | + | } | |
293 | + | } | |
294 | + | } | |
295 | + | } | |
296 | + | else throw("Strict value is not equal to itself.") | |
297 | + | } | |
298 | + | ||
299 | + | ||
300 | + | ||
301 | + | @Callable(i) | |
302 | + | func exchangeResources (amounts) = { | |
303 | + | let blocked = checkBlocked() | |
304 | + | if ((blocked == blocked)) | |
305 | + | then { | |
306 | + | let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked") | |
307 | + | if ((size(i.payments) != 1)) | |
308 | + | then throw("exactly 1 payment must be attached") | |
309 | + | else { | |
310 | + | let pmt = i.payments[0] | |
311 | + | let amt = pmt.amount | |
312 | + | let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment") | |
313 | + | if ((pmtAssetId != usdnAssetId)) | |
314 | + | then throw("USDN payments only!") | |
315 | + | else { | |
316 | + | let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_") | |
317 | + | if ((curLocation[locIdxType] != "F")) | |
318 | + | then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType])) | |
319 | + | else { | |
320 | + | let locId = curLocation[locIdxId] | |
321 | + | let currentPack = getBackpack(keyBackpackByDuck(duckAssetId)) | |
322 | + | let resList = split(currentPack[bpIdxRes], "_") | |
323 | + | let matList = split(currentPack[bpIdxMat], "_") | |
324 | + | func exchanger (acc,j) = { | |
325 | + | let amj = amounts[j] | |
326 | + | if ((amj > parseIntValue(resList[j]))) | |
327 | + | then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj))) | |
328 | + | else if ((0 > amj)) | |
329 | + | then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj))) | |
330 | + | else if ((amj > 0)) | |
331 | + | then $Tuple3((acc._1 :+ toString((parseIntValue(resList[j]) - amj))), (acc._2 :+ toString((parseIntValue(matList[j]) + amj))), (acc._3 + fraction(amj, RESOURCEPRICEMIN, MULT8))) | |
332 | + | else $Tuple3((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3) | |
333 | + | } | |
334 | + | ||
335 | + | let merged = { | |
336 | + | let $l = [0, 1, 2, 3, 4, 5] | |
337 | + | let $s = size($l) | |
338 | + | let $acc0 = $Tuple3(nil, nil, 0) | |
339 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
340 | + | then $a | |
341 | + | else exchanger($a, $l[$i]) | |
342 | + | ||
343 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
344 | + | then $a | |
345 | + | else throw("List size exceeds 6") | |
346 | + | ||
347 | + | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6) | |
348 | + | } | |
349 | + | if ((merged._3 > amt)) | |
350 | + | then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3))) | |
351 | + | else { | |
352 | + | let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._1, "_"), makeString(merged._2, "_"), currentPack[bpIdxProd]], ":") | |
353 | + | let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil)) | |
354 | + | let rest = if (((amt - merged._3) > 0)) | |
355 | + | then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)] | |
356 | + | else nil | |
357 | + | $Tuple2(rest, result) | |
252 | 358 | } | |
253 | 359 | } | |
254 | 360 | } |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let SEP = "__" | |
5 | + | ||
4 | 6 | let MULT6 = 1000000 | |
5 | 7 | ||
6 | 8 | let MULT8 = 100000000 | |
7 | 9 | ||
8 | 10 | let MULT10 = 10000000000 | |
9 | 11 | ||
10 | 12 | let chain = take(drop(this.bytes, 1), 1) | |
11 | 13 | ||
12 | 14 | let usdnAssetId = match chain { | |
13 | 15 | case _ => | |
14 | 16 | if ((base58'2W' == $match0)) | |
15 | 17 | then base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
16 | 18 | else if ((base58'2T' == $match0)) | |
17 | 19 | then base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ' | |
18 | 20 | else throw("Unknown chain") | |
19 | 21 | } | |
20 | 22 | ||
21 | - | let | |
23 | + | let defaultRestAddressStr = match chain { | |
22 | 24 | case _ => | |
23 | 25 | if ((base58'2W' == $match0)) | |
24 | - | then " | |
26 | + | then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv" | |
25 | 27 | else if ((base58'2T' == $match0)) | |
26 | - | then " | |
28 | + | then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy" | |
27 | 29 | else throw("Unknown chain") | |
28 | - | }) | |
30 | + | } | |
31 | + | ||
32 | + | func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")) | |
33 | + | ||
34 | + | ||
35 | + | func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal) | |
36 | + | ||
37 | + | ||
38 | + | let IdxCfgStakingDapp = 1 | |
39 | + | ||
40 | + | let IdxCfgEconomyDapp = 2 | |
41 | + | ||
42 | + | let IdxCfgGovernanceDapp = 3 | |
43 | + | ||
44 | + | func keyRestCfg () = "%s__restConfig" | |
45 | + | ||
46 | + | ||
47 | + | func keyRestAddress () = "%s__restAddr" | |
48 | + | ||
49 | + | ||
50 | + | func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP) | |
51 | + | ||
52 | + | ||
53 | + | func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx))) | |
54 | + | ||
55 | + | ||
56 | + | let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr)) | |
57 | + | ||
58 | + | let restCfg = readRestCfgOrFail(restContract) | |
59 | + | ||
60 | + | let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp) | |
29 | 61 | ||
30 | 62 | let DEFAULTLOCATION = "Africa_F_Africa" | |
31 | 63 | ||
32 | 64 | let NUMRES = 6 | |
33 | 65 | ||
34 | 66 | let FACTORYMAXWAREHOUSE = 10000000000 | |
35 | 67 | ||
36 | 68 | let RESOURCEPRICEMIN = 158549 | |
37 | 69 | ||
38 | 70 | let MINPAYMENT = 10000 | |
39 | 71 | ||
40 | 72 | let SELLMULTIPLIER = 200 | |
41 | 73 | ||
42 | 74 | let BUYMULTIPLIER = 300 | |
43 | 75 | ||
44 | 76 | let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"] | |
45 | 77 | ||
46 | 78 | let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"] | |
47 | 79 | ||
48 | 80 | let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"] | |
49 | 81 | ||
50 | 82 | let productionMatrix = ["1_1_1_2_2_5_1_10", "2_5_5_2_7_5_2_100", "1_1_1_2_2_5_1_10", "9_9_1_5_5_1_5_100", "1_5_1_5_5_1_1_100"] | |
51 | 83 | ||
52 | 84 | let contIdxAmericas = 0 | |
53 | 85 | ||
54 | 86 | let contIdxEurope = 1 | |
55 | 87 | ||
56 | 88 | let contIdxAsia = 2 | |
57 | 89 | ||
58 | 90 | let contIdxAfrica = 3 | |
59 | 91 | ||
60 | 92 | let contIdxOceania = 4 | |
61 | 93 | ||
62 | 94 | func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType)) | |
63 | 95 | ||
64 | 96 | ||
65 | 97 | func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr) | |
66 | 98 | ||
67 | 99 | ||
68 | 100 | func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId) | |
69 | 101 | ||
70 | 102 | ||
71 | 103 | func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId) | |
72 | 104 | ||
73 | 105 | ||
74 | 106 | func keyBlocked () = "contractsBlocked" | |
75 | 107 | ||
76 | 108 | ||
77 | 109 | let locIdxContinent = 0 | |
78 | 110 | ||
79 | 111 | let locIdxType = 1 | |
80 | 112 | ||
81 | 113 | let locIdxId = 2 | |
82 | 114 | ||
83 | 115 | let bpIdxLevel = 0 | |
84 | 116 | ||
85 | 117 | let bpIdxRes = 1 | |
86 | 118 | ||
87 | 119 | let bpIdxMat = 2 | |
88 | 120 | ||
89 | 121 | let bpIdxProd = 3 | |
90 | 122 | ||
91 | 123 | func asString (v) = match v { | |
92 | 124 | case s: String => | |
93 | 125 | s | |
94 | 126 | case _ => | |
95 | 127 | throw("fail to cast into String") | |
96 | 128 | } | |
97 | 129 | ||
98 | 130 | ||
99 | 131 | func sellInternal (locId,resType,amount,minPrice) = { | |
100 | 132 | let whKey = keyFactoryWarehouseByIdAndType(locId, resType) | |
101 | 133 | let w0 = valueOrElse(getInteger(whKey), 0) | |
102 | 134 | let r0 = if ((w0 > FACTORYMAXWAREHOUSE)) | |
103 | 135 | then 0 | |
104 | 136 | else if (((w0 + amount) > FACTORYMAXWAREHOUSE)) | |
105 | 137 | then (FACTORYMAXWAREHOUSE - w0) | |
106 | 138 | else amount | |
107 | 139 | let usdnReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8)) | |
108 | 140 | let min99 = (minPrice - (minPrice / 100)) | |
109 | 141 | if (((min99 * amount) > (usdnReceived * MULT8))) | |
110 | 142 | then throw((((((((((("Actual price = " + toString(usdnReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")")) | |
111 | 143 | else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdnReceived) | |
112 | 144 | } | |
113 | 145 | ||
114 | 146 | ||
115 | 147 | func buyInternal (locId,matType,amount,maxPrice) = { | |
116 | 148 | let whKey = keyFactoryWarehouseByIdAndType(locId, matType) | |
117 | 149 | let w0 = valueOrElse(getInteger(whKey), 0) | |
118 | 150 | let m1 = if ((w0 > FACTORYMAXWAREHOUSE)) | |
119 | 151 | then min([amount, (w0 - FACTORYMAXWAREHOUSE)]) | |
120 | 152 | else 0 | |
121 | 153 | let m0 = min([w0, (amount - m1)]) | |
122 | 154 | let m = (m0 + m1) | |
123 | 155 | let usdnSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8)) | |
124 | 156 | let max101 = (maxPrice + (maxPrice / 100)) | |
125 | 157 | if (((usdnSpent * MULT8) > (max101 * m))) | |
126 | 158 | then throw((((((((((("Actual price = " + toString(usdnSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")")) | |
127 | 159 | else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdnSpent, m) | |
128 | 160 | } | |
129 | 161 | ||
130 | 162 | ||
131 | 163 | func getBackpack (bpKey) = { | |
132 | 164 | let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":") | |
133 | 165 | [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES)) | |
134 | 166 | then p[bpIdxRes] | |
135 | 167 | else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES)) | |
136 | 168 | then p[bpIdxMat] | |
137 | 169 | else "0_0_0_0_0_0", p[bpIdxProd]] | |
138 | 170 | } | |
139 | 171 | ||
140 | 172 | ||
141 | 173 | func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false)) | |
142 | 174 | then throw("Contracts are under maintenance") | |
143 | 175 | else unit | |
144 | 176 | ||
145 | 177 | ||
146 | 178 | @Callable(i) | |
179 | + | func constructorV1 (restAddr) = if ((i.caller != this)) | |
180 | + | then throw("Permission denied") | |
181 | + | else [StringEntry(keyRestAddress(), restAddr)] | |
182 | + | ||
183 | + | ||
184 | + | ||
185 | + | @Callable(i) | |
147 | 186 | func sellResources (amounts,minPrices) = { | |
148 | 187 | let blocked = checkBlocked() | |
149 | 188 | if ((blocked == blocked)) | |
150 | 189 | then { | |
151 | 190 | let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked") | |
152 | 191 | if ((size(i.payments) != 0)) | |
153 | 192 | then throw("sellResources doesn't require any payments") | |
154 | 193 | else { | |
155 | 194 | let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_") | |
156 | 195 | if ((curLocation[locIdxType] != "F")) | |
157 | 196 | then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType])) | |
158 | 197 | else { | |
159 | 198 | let locId = curLocation[locIdxId] | |
160 | 199 | let currentPack = getBackpack(keyBackpackByDuck(duckAssetId)) | |
161 | 200 | let resList = split(currentPack[bpIdxRes], "_") | |
162 | 201 | func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j]))) | |
163 | 202 | then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j]))) | |
164 | 203 | else if ((0 > amounts[j])) | |
165 | 204 | then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j]))) | |
166 | 205 | else if ((amounts[j] > 0)) | |
167 | 206 | then { | |
168 | 207 | let b = sellInternal(locId, j, amounts[j], minPrices[j]) | |
169 | 208 | $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2)) | |
170 | 209 | } | |
171 | 210 | else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3) | |
172 | 211 | ||
173 | 212 | let merged = { | |
174 | 213 | let $l = [0, 1, 2, 3, 4, 5] | |
175 | 214 | let $s = size($l) | |
176 | 215 | let $acc0 = $Tuple3(nil, nil, 0) | |
177 | 216 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
178 | 217 | then $a | |
179 | 218 | else adder($a, $l[$i]) | |
180 | 219 | ||
181 | 220 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
182 | 221 | then $a | |
183 | 222 | else throw("List size exceeds 6") | |
184 | 223 | ||
185 | 224 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6) | |
186 | 225 | } | |
187 | 226 | let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":") | |
188 | 227 | let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil)) | |
189 | 228 | $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdnAssetId)), result) | |
190 | 229 | } | |
191 | 230 | } | |
192 | 231 | } | |
193 | 232 | else throw("Strict value is not equal to itself.") | |
194 | 233 | } | |
195 | 234 | ||
196 | 235 | ||
197 | 236 | ||
198 | 237 | @Callable(i) | |
199 | 238 | func buyMaterials (amounts,maxPrices) = { | |
200 | 239 | let blocked = checkBlocked() | |
201 | 240 | if ((blocked == blocked)) | |
202 | 241 | then { | |
203 | 242 | let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked") | |
204 | 243 | if ((size(i.payments) != 1)) | |
205 | 244 | then throw("exactly 1 payment must be attached") | |
206 | 245 | else { | |
207 | 246 | let pmt = i.payments[0] | |
208 | 247 | let amt = pmt.amount | |
209 | 248 | let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment") | |
210 | 249 | if ((pmtAssetId != usdnAssetId)) | |
211 | 250 | then throw("USDN payments only!") | |
212 | 251 | else { | |
213 | 252 | let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_") | |
214 | 253 | if ((curLocation[locIdxType] != "F")) | |
215 | 254 | then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType])) | |
216 | 255 | else { | |
217 | 256 | let locId = curLocation[locIdxId] | |
218 | 257 | let currentPack = getBackpack(keyBackpackByDuck(duckAssetId)) | |
219 | 258 | let matList = split(currentPack[bpIdxMat], "_") | |
220 | 259 | func mUpdater (acc,j) = if ((0 > amounts[j])) | |
221 | 260 | then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j]))) | |
222 | 261 | else if ((amounts[j] > 0)) | |
223 | 262 | then { | |
224 | 263 | let b = buyInternal(locId, j, amounts[j], maxPrices[j]) | |
225 | 264 | $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2)) | |
226 | 265 | } | |
227 | 266 | else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3) | |
228 | 267 | ||
229 | 268 | let merged = { | |
230 | 269 | let $l = [0, 1, 2, 3, 4, 5] | |
231 | 270 | let $s = size($l) | |
232 | 271 | let $acc0 = $Tuple3(nil, nil, 0) | |
233 | 272 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
234 | 273 | then $a | |
235 | 274 | else mUpdater($a, $l[$i]) | |
236 | 275 | ||
237 | 276 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
238 | 277 | then $a | |
239 | 278 | else throw("List size exceeds 6") | |
240 | 279 | ||
241 | 280 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6) | |
242 | 281 | } | |
243 | 282 | if ((merged._3 > amt)) | |
244 | 283 | then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3))) | |
245 | 284 | else { | |
246 | 285 | let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":") | |
247 | 286 | let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil)) | |
248 | 287 | let rest = if (((amt - merged._3) > 0)) | |
249 | 288 | then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)] | |
250 | 289 | else nil | |
251 | 290 | $Tuple2((merged._1 ++ rest), result) | |
291 | + | } | |
292 | + | } | |
293 | + | } | |
294 | + | } | |
295 | + | } | |
296 | + | else throw("Strict value is not equal to itself.") | |
297 | + | } | |
298 | + | ||
299 | + | ||
300 | + | ||
301 | + | @Callable(i) | |
302 | + | func exchangeResources (amounts) = { | |
303 | + | let blocked = checkBlocked() | |
304 | + | if ((blocked == blocked)) | |
305 | + | then { | |
306 | + | let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked") | |
307 | + | if ((size(i.payments) != 1)) | |
308 | + | then throw("exactly 1 payment must be attached") | |
309 | + | else { | |
310 | + | let pmt = i.payments[0] | |
311 | + | let amt = pmt.amount | |
312 | + | let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment") | |
313 | + | if ((pmtAssetId != usdnAssetId)) | |
314 | + | then throw("USDN payments only!") | |
315 | + | else { | |
316 | + | let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_") | |
317 | + | if ((curLocation[locIdxType] != "F")) | |
318 | + | then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType])) | |
319 | + | else { | |
320 | + | let locId = curLocation[locIdxId] | |
321 | + | let currentPack = getBackpack(keyBackpackByDuck(duckAssetId)) | |
322 | + | let resList = split(currentPack[bpIdxRes], "_") | |
323 | + | let matList = split(currentPack[bpIdxMat], "_") | |
324 | + | func exchanger (acc,j) = { | |
325 | + | let amj = amounts[j] | |
326 | + | if ((amj > parseIntValue(resList[j]))) | |
327 | + | then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj))) | |
328 | + | else if ((0 > amj)) | |
329 | + | then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj))) | |
330 | + | else if ((amj > 0)) | |
331 | + | then $Tuple3((acc._1 :+ toString((parseIntValue(resList[j]) - amj))), (acc._2 :+ toString((parseIntValue(matList[j]) + amj))), (acc._3 + fraction(amj, RESOURCEPRICEMIN, MULT8))) | |
332 | + | else $Tuple3((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3) | |
333 | + | } | |
334 | + | ||
335 | + | let merged = { | |
336 | + | let $l = [0, 1, 2, 3, 4, 5] | |
337 | + | let $s = size($l) | |
338 | + | let $acc0 = $Tuple3(nil, nil, 0) | |
339 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
340 | + | then $a | |
341 | + | else exchanger($a, $l[$i]) | |
342 | + | ||
343 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
344 | + | then $a | |
345 | + | else throw("List size exceeds 6") | |
346 | + | ||
347 | + | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6) | |
348 | + | } | |
349 | + | if ((merged._3 > amt)) | |
350 | + | then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3))) | |
351 | + | else { | |
352 | + | let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._1, "_"), makeString(merged._2, "_"), currentPack[bpIdxProd]], ":") | |
353 | + | let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil)) | |
354 | + | let rest = if (((amt - merged._3) > 0)) | |
355 | + | then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)] | |
356 | + | else nil | |
357 | + | $Tuple2(rest, result) | |
252 | 358 | } | |
253 | 359 | } | |
254 | 360 | } | |
255 | 361 | } | |
256 | 362 | } | |
257 | 363 | else throw("Strict value is not equal to itself.") | |
258 | 364 | } | |
259 | 365 | ||
260 | 366 | ||
261 | 367 | ||
262 | 368 | @Callable(i) | |
263 | 369 | func buyGoods (productIdx,level,quantity) = { | |
264 | 370 | let blocked = checkBlocked() | |
265 | 371 | if ((blocked == blocked)) | |
266 | 372 | then if ((size(i.payments) != 0)) | |
267 | 373 | then throw("buyGoods doesn't require any payments") | |
268 | 374 | else if ((0 > quantity)) | |
269 | 375 | then throw("Quantity should be positive") | |
270 | 376 | else { | |
271 | 377 | let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked") | |
272 | 378 | let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_") | |
273 | 379 | if ((curLocation[locIdxType] != "M")) | |
274 | 380 | then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType])) | |
275 | 381 | else { | |
276 | 382 | let cont = curLocation[locIdxContinent] | |
277 | 383 | let currentPack = getBackpack(keyBackpackByDuck(duckAssetId)) | |
278 | 384 | let matList = split(currentPack[bpIdxMat], "_") | |
279 | 385 | if (if ((0 > productIdx)) | |
280 | 386 | then true | |
281 | 387 | else (productIdx >= size(productionMatrix))) | |
282 | 388 | then throw(("Unknown product idx=" + toString(productIdx))) | |
283 | 389 | else { | |
284 | 390 | let productContIdx = (productIdx % size(continents)) | |
285 | 391 | if ((continents[productContIdx] != cont)) | |
286 | 392 | then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont)) | |
287 | 393 | else { | |
288 | 394 | let recipe = split(productionMatrix[productIdx], "_") | |
289 | 395 | if ((size(recipe) != (NUMRES + 2))) | |
290 | 396 | then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx])) | |
291 | 397 | else { | |
292 | 398 | let prodList = if ((currentPack[bpIdxProd] == "")) | |
293 | 399 | then nil | |
294 | 400 | else split(currentPack[bpIdxProd], "_") | |
295 | 401 | func filler (acc,ignoredItem) = { | |
296 | 402 | let n = acc._2 | |
297 | 403 | let x = if ((size(prodList) > n)) | |
298 | 404 | then split(prodList[n], ",") | |
299 | 405 | else ["0", "0", "0"] | |
300 | 406 | let x1s = x[0] | |
301 | 407 | let x1 = parseIntValue(x1s) | |
302 | 408 | let x2s = x[1] | |
303 | 409 | let x2 = parseIntValue(x2s) | |
304 | 410 | let x3s = x[2] | |
305 | 411 | let x3 = parseIntValue(x3s) | |
306 | 412 | let amount = (quantity * parseIntValue(recipe[7])) | |
307 | 413 | let y = if ((n == productIdx)) | |
308 | 414 | then match level { | |
309 | 415 | case _ => | |
310 | 416 | if ((1 == $match0)) | |
311 | 417 | then ((((toString((x1 + amount)) + ",") + x2s) + ",") + x3s) | |
312 | 418 | else if ((2 == $match0)) | |
313 | 419 | then ((((x1s + ",") + toString((x2 + amount))) + ",") + x3s) | |
314 | 420 | else if ((3 == $match0)) | |
315 | 421 | then ((((x1s + ",") + x2s) + ",") + toString((x3 + amount))) | |
316 | 422 | else throw(("Product level should be 1..3, not " + toString(level))) | |
317 | 423 | } | |
318 | 424 | else ((((x1s + ",") + x2s) + ",") + x3s) | |
319 | 425 | $Tuple2((acc._1 :+ y), (n + 1)) | |
320 | 426 | } | |
321 | 427 | ||
322 | 428 | let bpProd = ( let $l = productionMatrix | |
323 | 429 | let $s = size($l) | |
324 | 430 | let $acc0 = $Tuple2(nil, 0) | |
325 | 431 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
326 | 432 | then $a | |
327 | 433 | else filler($a, $l[$i]) | |
328 | 434 | ||
329 | 435 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
330 | 436 | then $a | |
331 | 437 | else throw("List size exceeds 50") | |
332 | 438 | ||
333 | 439 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._1 | |
334 | 440 | func producer (acc,j) = { | |
335 | 441 | let needMat = (parseIntValue(recipe[j]) * quantity) | |
336 | 442 | let haveMat = parseIntValue(matList[j]) | |
337 | 443 | if ((needMat > haveMat)) | |
338 | 444 | then throw(((((((("You have " + matList[j]) + " of ") + matTypes[j]) + ", but recipe requires ") + toString(needMat)) + " for quantity ") + toString(quantity))) | |
339 | 445 | else if ((needMat > 0)) | |
340 | 446 | then (acc :+ toString((haveMat - needMat))) | |
341 | 447 | else (acc :+ matList[j]) | |
342 | 448 | } | |
343 | 449 | ||
344 | 450 | let merged = { | |
345 | 451 | let $l = [0, 1, 2, 3, 4, 5] | |
346 | 452 | let $s = size($l) | |
347 | 453 | let $acc0 = nil | |
348 | 454 | func $f1_1 ($a,$i) = if (($i >= $s)) | |
349 | 455 | then $a | |
350 | 456 | else producer($a, $l[$i]) | |
351 | 457 | ||
352 | 458 | func $f1_2 ($a,$i) = if (($i >= $s)) | |
353 | 459 | then $a | |
354 | 460 | else throw("List size exceeds 6") | |
355 | 461 | ||
356 | 462 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6) | |
357 | 463 | } | |
358 | 464 | let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged, "_"), makeString(bpProd, "_")], ":") | |
359 | 465 | let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil)) | |
360 | 466 | $Tuple2(nil, result) | |
361 | 467 | } | |
362 | 468 | } | |
363 | 469 | } | |
364 | 470 | } | |
365 | 471 | } | |
366 | 472 | else throw("Strict value is not equal to itself.") | |
367 | 473 | } | |
368 | 474 | ||
369 | 475 |
github/deemru/w8io/169f3d6 63.44 ms ◑