tx · BGcNYRBLDrNgkr35x5d8MQLG6mNZ2thHpP1BikN6NqHu 3PKqU33eTC4t8PiPJ12ZHrBUBfy3fTxiwWg: -0.01000000 Waves 2022.05.06 16:44 [3105387] smart account 3PKqU33eTC4t8PiPJ12ZHrBUBfy3fTxiwWg > SELF 0.00000000 Waves
{ "type": 13, "id": "BGcNYRBLDrNgkr35x5d8MQLG6mNZ2thHpP1BikN6NqHu", "fee": 1000000, "feeAssetId": null, "timestamp": 1651844709692, "version": 1, "sender": "3PKqU33eTC4t8PiPJ12ZHrBUBfy3fTxiwWg", "senderPublicKey": "HxBHKkNtapZU6ZYPQsaHuRbUUyz5qJCjYkfBRAbr7hca", "proofs": [ "2iEFw9Wbw6cjcXhjJp29qABZNSPZg7abSxBvNzNcPMTof4NkzjyEY2K4d6mviVXxkG9LVhP5CNAxBSkE3b9LRqdv" ], "script": "base64:AAIFAAAAAAAAABUIAhIGCgQICAgIEgkKBwgICAgIAQEAAAAGAQAAAA1hc1VzZXJCYWxhbmNlAAAAAQAAAAV2YWx1ZQQAAAAHJG1hdGNoMAUAAAAFdmFsdWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAIihJbnQsIEludCwgSW50LCBJbnQsIEludCwgQm9vbGVhbikEAAAAAXgFAAAAByRtYXRjaDAFAAAAAXgEAAAAAXQFAAAAByRtYXRjaDAJAAACAAAAAQIAAAANZXhwZWN0ZWQgaW50NQEAAAAFYXNJbnQAAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAANpbnQFAAAAByRtYXRjaDAFAAAAA2ludAkAAAIAAAABAgAAABl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQAAAAl0b0Fzc2V0SWQAAAABAAAAB2Fzc2V0SWQDCQAAAAAAAAIFAAAAB2Fzc2V0SWQCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAAB2Fzc2V0SWQBAAAAC3VzZXJCYWxhbmNlAAAAAgAAAAdyZXNlcnZlAAAABHVzZXIJAQAAAA1hc1VzZXJCYWxhbmNlAAAAAQkAA/wAAAAEBQAAAAdyZXNlcnZlAgAAAAt1c2VyQmFsYW5jZQkABEwAAAACBQAAAAR1c2VyBQAAAANuaWwFAAAAA25pbAEAAAAKZ2V0QmFsYW5jZQAAAAIAAAAOYWRkcmVzc09yQWxpYXMAAAAHYXNzZXRJZAMJAAAAAAAAAgUAAAAHYXNzZXRJZAIAAAAFV0FWRVMICQAD7wAAAAEFAAAADmFkZHJlc3NPckFsaWFzAAAACWF2YWlsYWJsZQkAA/AAAAACBQAAAA5hZGRyZXNzT3JBbGlhcwkAAlkAAAABBQAAAAdhc3NldElkAQAAAAdwYXltZW50AAAAAgAAAAdhc3NldElkAAAABmFtb3VudAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgkBAAAACXRvQXNzZXRJZAAAAAEFAAAAB2Fzc2V0SWQFAAAABmFtb3VudAUAAAADbmlsAAAAAgAAAAFpAQAAAAppbml0aWFsaXplAAAABAAAAARtYWluAAAABW1haW4yAAAACWV4Y2hhbmdlcgAAAAdpbnZva2VyAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAF29ubHkgc2VsZiBjYW4gY29uZmlndXJlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAABG1haW4FAAAABG1haW4JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgIAAAAFbWFpbjIFAAAABW1haW4yCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAACWV4Y2hhbmdlcgUAAAAJZXhjaGFuZ2VyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAAB2ludm9rZXIFAAAAB2ludm9rZXIFAAAAA25pbAAAAAFpAQAAAAlsaXF1aWRhdGUAAAAHAAAAC2JvcnJvd0Fzc2V0AAAADWJvcnJvd1Jlc2VydmUAAAAPY29sbGF0ZXJhbEFzc2V0AAAAEWNvbGxhdGVyYWxSZXNlcnZlAAAACGJvcnJvd2VyAAAAD2xpcXVpZGF0ZUFtb3VudAAAAAtleGNoYWdlUmF0ZQMJAQAAAAEhAAAAAQkBAAAACGNvbnRhaW5zAAAAAgkBAAAABXZhbHVlAAAAAQkABB0AAAACBQAAAAR0aGlzAgAAAAdpbnZva2VyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAABZvbmx5IGludm9rZXIocykgY2FuIGRvBAAAAAttYWluQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQIAAAAjM1BBWnY5dGdLMVBYN2RLUjdiNGtjaHE1cWRwVVMzRzVzWVQEAAAADG1haW4yQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQIAAAAjM1BKNmlSNVgxUFQyclpjTm1icUJ5S3VoN2s4bXRqNXdWR3cEAAAACWV4Y2hhbmdlcgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAABXZhbHVlAAAAAQkABB0AAAACBQAAAAR0aGlzAgAAAAlleGNoYW5nZXIEAAAAG2NvbGxhdGVyYWxBbW91bnRUb0xpcXVpZGF0ZQkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAxtYWluMkFkZHJlc3MCAAAADHRyYW5zZmVyRGVidAkABEwAAAACBQAAAA1ib3Jyb3dSZXNlcnZlCQAETAAAAAIFAAAAEWNvbGxhdGVyYWxSZXNlcnZlCQAETAAAAAIFAAAACGJvcnJvd2VyCQAETAAAAAIFAAAAD2xpcXVpZGF0ZUFtb3VudAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAG2NvbGxhdGVyYWxBbW91bnRUb0xpcXVpZGF0ZQUAAAAbY29sbGF0ZXJhbEFtb3VudFRvTGlxdWlkYXRlBAAAAA53aXRoZHJhd0FjdGlvbgkAA/wAAAAEBQAAAAttYWluQWRkcmVzcwIAAAAJd2l0aGRyYXcyCQAETAAAAAIFAAAAEWNvbGxhdGVyYWxSZXNlcnZlCQAETAAAAAIFAAAAG2NvbGxhdGVyYWxBbW91bnRUb0xpcXVpZGF0ZQUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAADndpdGhkcmF3QWN0aW9uBQAAAA53aXRoZHJhd0FjdGlvbgQAAAATYm9ycm93QmFsYW5jZUJlZm9yZQkBAAAACmdldEJhbGFuY2UAAAACBQAAAAR0aGlzBQAAAAtib3Jyb3dBc3NldAMJAAAAAAAAAgUAAAATYm9ycm93QmFsYW5jZUJlZm9yZQUAAAATYm9ycm93QmFsYW5jZUJlZm9yZQQAAAAOZXhjaGFuZ2VBY3Rpb24JAAP8AAAABAUAAAAJZXhjaGFuZ2VyAgAAAAhleGNoYW5nZQkABEwAAAACBQAAAAtib3Jyb3dBc3NldAkABEwAAAACBQAAAAtleGNoYWdlUmF0ZQUAAAADbmlsCQEAAAAHcGF5bWVudAAAAAIFAAAAD2NvbGxhdGVyYWxBc3NldAUAAAAbY29sbGF0ZXJhbEFtb3VudFRvTGlxdWlkYXRlAwkAAAAAAAACBQAAAA5leGNoYW5nZUFjdGlvbgUAAAAOZXhjaGFuZ2VBY3Rpb24EAAAAEmJvcnJvd0JhbGFuY2VBZnRlcgkBAAAACmdldEJhbGFuY2UAAAACBQAAAAR0aGlzBQAAAAtib3Jyb3dBc3NldAMJAAAAAAAAAgUAAAASYm9ycm93QmFsYW5jZUFmdGVyBQAAABJib3Jyb3dCYWxhbmNlQWZ0ZXIEAAAADWV4Y2hhbmdlZERlYnQJAABlAAAAAgUAAAASYm9ycm93QmFsYW5jZUFmdGVyBQAAABNib3Jyb3dCYWxhbmNlQmVmb3JlAwkAAAAAAAACBQAAAA1leGNoYW5nZWREZWJ0BQAAAA1leGNoYW5nZWREZWJ0BAAAAAtyZXBheUFjdGlvbgkAA/wAAAAEBQAAAAttYWluQWRkcmVzcwIAAAAFcmVwYXkJAARMAAAAAgUAAAANYm9ycm93UmVzZXJ2ZQUAAAADbmlsCQEAAAAHcGF5bWVudAAAAAIFAAAAC2JvcnJvd0Fzc2V0BQAAAA1leGNoYW5nZWREZWJ0AwkAAAAAAAACBQAAAAtyZXBheUFjdGlvbgUAAAALcmVwYXlBY3Rpb24EAAAABGRlYnQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAA1ib3Jyb3dSZXNlcnZlCQABLAAAAAIJAAQlAAAAAQUAAAAEdGhpcwIAAAAFX2RlYnQCAAAAE2Vycm9yOiBtdXN0IHByZXNlbnQDCQAAAAAAAAIFAAAABGRlYnQFAAAABGRlYnQEAAAAB2RldGFpbHMJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAASbGlxdWlkYXRlQW1vdW50ID0gCQABpAAAAAEFAAAAD2xpcXVpZGF0ZUFtb3VudAIAAAABIAUAAAALYm9ycm93QXNzZXQCAAAAHiwgY29sbGF0ZXJhbEFtb3VudFdpdGhkcmF3biA9IAkAAaQAAAABBQAAABtjb2xsYXRlcmFsQW1vdW50VG9MaXF1aWRhdGUCAAAAASAFAAAAD2NvbGxhdGVyYWxBc3NldAIAAAAMLCBzd2FwcGVkID0gCQABpAAAAAEFAAAADWV4Y2hhbmdlZERlYnQCAAAAASAFAAAAC2JvcnJvd0Fzc2V0AgAAAA4sIG9wZW4gZGVidCA9IAkAAaQAAAABBQAAAARkZWJ0AwkBAAAAAiE9AAAAAgUAAAAEZGVidAAAAAAAAAAAAAkAAAIAAAABCQABLAAAAAICAAAAN2xpcXVpZGF0aW9uIGZhaWxlZDogb3V0c3RhbmRpbmcgZGVidCBvY2N1cnJlZC4gZGV0YWlsczoFAAAAB2RldGFpbHMFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAADxK0Ys=", "chainId": 87, "height": 3105387, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3vkLG2syn4uU6sXYSrXwC72LTqLnLMbwdy3dBsRCb4uo Next: none Diff:
Old | New | Differences | |
---|---|---|---|
34 | 34 | ||
35 | 35 | ||
36 | 36 | @Callable(i) | |
37 | - | func initialize (main,exchanger,invoker) = if ((i.caller != this)) | |
37 | + | func initialize (main,main2,exchanger,invoker) = if ((i.caller != this)) | |
38 | 38 | then throw("only self can configure") | |
39 | - | else [StringEntry("main", main), StringEntry("exchanger", exchanger), StringEntry("invoker", invoker)] | |
39 | + | else [StringEntry("main", main), StringEntry("main2", main2), StringEntry("exchanger", exchanger), StringEntry("invoker", invoker)] | |
40 | 40 | ||
41 | 41 | ||
42 | 42 | ||
44 | 44 | func liquidate (borrowAsset,borrowReserve,collateralAsset,collateralReserve,borrower,liquidateAmount,exchageRate) = if (!(contains(value(getString(this, "invoker")), toString(i.caller)))) | |
45 | 45 | then throw("only invoker(s) can do") | |
46 | 46 | else { | |
47 | - | let mainAddress = addressFromStringValue(value(getString(this, "main"))) | |
47 | + | let mainAddress = addressFromStringValue("3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT") | |
48 | + | let main2Address = addressFromStringValue("3PJ6iR5X1PT2rZcNmbqByKuh7k8mtj5wVGw") | |
48 | 49 | let exchanger = addressFromStringValue(value(getString(this, "exchanger"))) | |
49 | - | let collateralAmountToLiquidate = asInt(invoke( | |
50 | + | let collateralAmountToLiquidate = asInt(invoke(main2Address, "transferDebt", [borrowReserve, collateralReserve, borrower, liquidateAmount], nil)) | |
50 | 51 | if ((collateralAmountToLiquidate == collateralAmountToLiquidate)) | |
51 | 52 | then { | |
52 | 53 | let withdrawAction = invoke(mainAddress, "withdraw2", [collateralReserve, collateralAmountToLiquidate], nil) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func asUserBalance (value) = match value { | |
5 | 5 | case x: (Int, Int, Int, Int, Int, Boolean) => | |
6 | 6 | x | |
7 | 7 | case t => | |
8 | 8 | throw("expected int5") | |
9 | 9 | } | |
10 | 10 | ||
11 | 11 | ||
12 | 12 | func asInt (value) = match value { | |
13 | 13 | case int: Int => | |
14 | 14 | int | |
15 | 15 | case _ => | |
16 | 16 | throw("wrong type, expected: Int") | |
17 | 17 | } | |
18 | 18 | ||
19 | 19 | ||
20 | 20 | func toAssetId (assetId) = if ((assetId == "WAVES")) | |
21 | 21 | then unit | |
22 | 22 | else fromBase58String(assetId) | |
23 | 23 | ||
24 | 24 | ||
25 | 25 | func userBalance (reserve,user) = asUserBalance(invoke(reserve, "userBalance", [user], nil)) | |
26 | 26 | ||
27 | 27 | ||
28 | 28 | func getBalance (addressOrAlias,assetId) = if ((assetId == "WAVES")) | |
29 | 29 | then wavesBalance(addressOrAlias).available | |
30 | 30 | else assetBalance(addressOrAlias, fromBase58String(assetId)) | |
31 | 31 | ||
32 | 32 | ||
33 | 33 | func payment (assetId,amount) = [AttachedPayment(toAssetId(assetId), amount)] | |
34 | 34 | ||
35 | 35 | ||
36 | 36 | @Callable(i) | |
37 | - | func initialize (main,exchanger,invoker) = if ((i.caller != this)) | |
37 | + | func initialize (main,main2,exchanger,invoker) = if ((i.caller != this)) | |
38 | 38 | then throw("only self can configure") | |
39 | - | else [StringEntry("main", main), StringEntry("exchanger", exchanger), StringEntry("invoker", invoker)] | |
39 | + | else [StringEntry("main", main), StringEntry("main2", main2), StringEntry("exchanger", exchanger), StringEntry("invoker", invoker)] | |
40 | 40 | ||
41 | 41 | ||
42 | 42 | ||
43 | 43 | @Callable(i) | |
44 | 44 | func liquidate (borrowAsset,borrowReserve,collateralAsset,collateralReserve,borrower,liquidateAmount,exchageRate) = if (!(contains(value(getString(this, "invoker")), toString(i.caller)))) | |
45 | 45 | then throw("only invoker(s) can do") | |
46 | 46 | else { | |
47 | - | let mainAddress = addressFromStringValue(value(getString(this, "main"))) | |
47 | + | let mainAddress = addressFromStringValue("3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT") | |
48 | + | let main2Address = addressFromStringValue("3PJ6iR5X1PT2rZcNmbqByKuh7k8mtj5wVGw") | |
48 | 49 | let exchanger = addressFromStringValue(value(getString(this, "exchanger"))) | |
49 | - | let collateralAmountToLiquidate = asInt(invoke( | |
50 | + | let collateralAmountToLiquidate = asInt(invoke(main2Address, "transferDebt", [borrowReserve, collateralReserve, borrower, liquidateAmount], nil)) | |
50 | 51 | if ((collateralAmountToLiquidate == collateralAmountToLiquidate)) | |
51 | 52 | then { | |
52 | 53 | let withdrawAction = invoke(mainAddress, "withdraw2", [collateralReserve, collateralAmountToLiquidate], nil) | |
53 | 54 | if ((withdrawAction == withdrawAction)) | |
54 | 55 | then { | |
55 | 56 | let borrowBalanceBefore = getBalance(this, borrowAsset) | |
56 | 57 | if ((borrowBalanceBefore == borrowBalanceBefore)) | |
57 | 58 | then { | |
58 | 59 | let exchangeAction = invoke(exchanger, "exchange", [borrowAsset, exchageRate], payment(collateralAsset, collateralAmountToLiquidate)) | |
59 | 60 | if ((exchangeAction == exchangeAction)) | |
60 | 61 | then { | |
61 | 62 | let borrowBalanceAfter = getBalance(this, borrowAsset) | |
62 | 63 | if ((borrowBalanceAfter == borrowBalanceAfter)) | |
63 | 64 | then { | |
64 | 65 | let exchangedDebt = (borrowBalanceAfter - borrowBalanceBefore) | |
65 | 66 | if ((exchangedDebt == exchangedDebt)) | |
66 | 67 | then { | |
67 | 68 | let repayAction = invoke(mainAddress, "repay", [borrowReserve], payment(borrowAsset, exchangedDebt)) | |
68 | 69 | if ((repayAction == repayAction)) | |
69 | 70 | then { | |
70 | 71 | let debt = valueOrErrorMessage(getInteger(addressFromStringValue(borrowReserve), (toString(this) + "_debt")), "error: must present") | |
71 | 72 | if ((debt == debt)) | |
72 | 73 | then { | |
73 | 74 | let details = ((((((((((((("liquidateAmount = " + toString(liquidateAmount)) + " ") + borrowAsset) + ", collateralAmountWithdrawn = ") + toString(collateralAmountToLiquidate)) + " ") + collateralAsset) + ", swapped = ") + toString(exchangedDebt)) + " ") + borrowAsset) + ", open debt = ") + toString(debt)) | |
74 | 75 | if ((debt != 0)) | |
75 | 76 | then throw(("liquidation failed: outstanding debt occurred. details:" + details)) | |
76 | 77 | else nil | |
77 | 78 | } | |
78 | 79 | else throw("Strict value is not equal to itself.") | |
79 | 80 | } | |
80 | 81 | else throw("Strict value is not equal to itself.") | |
81 | 82 | } | |
82 | 83 | else throw("Strict value is not equal to itself.") | |
83 | 84 | } | |
84 | 85 | else throw("Strict value is not equal to itself.") | |
85 | 86 | } | |
86 | 87 | else throw("Strict value is not equal to itself.") | |
87 | 88 | } | |
88 | 89 | else throw("Strict value is not equal to itself.") | |
89 | 90 | } | |
90 | 91 | else throw("Strict value is not equal to itself.") | |
91 | 92 | } | |
92 | 93 | else throw("Strict value is not equal to itself.") | |
93 | 94 | } | |
94 | 95 | ||
95 | 96 |
github/deemru/w8io/3ef1775 44.65 ms ◑