tx · Az4WNCxRGVEcEAzp8X1pbMroYSRd1BKkTDLKS1N71Z6C 3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua: -0.01400000 Waves 2021.03.15 12:50 [1438668] smart account 3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua > SELF 0.00000000 Waves
{ "type": 13, "id": "Az4WNCxRGVEcEAzp8X1pbMroYSRd1BKkTDLKS1N71Z6C", "fee": 1400000, "feeAssetId": null, "timestamp": 1615801836677, "version": 2, "chainId": 84, "sender": "3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua", "senderPublicKey": "CTyHhnVTxf16Z4CmGGneAK8WB5g2QyT4MB8kUn8vPPcu", "proofs": [ "2vindUN8hcoR7LDnfEYmdAbcS8kCQG6NyaCdPwjeuHb7PYXrvL6wRH6hEQxWK2twJtbJGCaU243pNG8ttQSBjnr8" ], "script": "base64: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", "height": 1438668, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 13dSrx6iSpxQjaa9ownZP6Nb8rECNHAABVvpLs866Dkx Next: 7ekduY5P1SXuB5rnKSKY8XV92dgcHZVUQ3ReUoEDppJ3 Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let dAppAssetName = "test1" | |
5 | - | ||
6 | - | let dAppAssetId = base58'CyRPSWqSzLmynv4W4REGjqhEefZVg2ZobVbvTLi71UzN' | |
7 | - | ||
8 | - | let dAppMinAmountToLend = 500 | |
9 | - | ||
10 | - | let dAppMinAmountToBorrow = 100 | |
11 | - | ||
12 | - | let dAppMinBorrowFeePerc = 10 | |
13 | - | ||
14 | - | func getLendingPoolStack () = match getInteger(this, "lendingPoolStack") { | |
15 | - | case a: Int => | |
16 | - | a | |
4 | + | func isWavesAsset (assetId) = match assetId { | |
5 | + | case asset: ByteVector => | |
6 | + | false | |
7 | + | case waves: Unit => | |
8 | + | true | |
17 | 9 | case _ => | |
18 | - | | |
10 | + | throw("Match error") | |
19 | 11 | } | |
20 | 12 | ||
21 | 13 | ||
22 | - | func getFeePoolStack () = match getInteger(this, "feePoolStack") { | |
23 | - | case a: Int => | |
24 | - | a | |
25 | - | case _ => | |
26 | - | 0 | |
27 | - | } | |
14 | + | func getTreasury (assetId) = { | |
15 | + | let treasuryName = match assetId { | |
16 | + | case asset: ByteVector => | |
17 | + | ("Treasury-" + toBase58String(asset)) | |
18 | + | case waves: Unit => | |
19 | + | "Treasury-WAVES" | |
20 | + | case _ => | |
21 | + | throw("Match error") | |
22 | + | } | |
23 | + | match getInteger(this, treasuryName) { | |
24 | + | case val: Int => | |
25 | + | val | |
26 | + | case null => | |
27 | + | 0 | |
28 | + | } | |
29 | + | } | |
28 | 30 | ||
29 | 31 | ||
30 | 32 | @Callable(i) | |
31 | - | func | |
33 | + | func createGovernor () = if ((size(i.payments) != 1)) | |
32 | 34 | then throw("No payment attached") | |
33 | - | else if ((i.payments[0].assetId != dAppAssetId)) | |
34 | - | then throw((("Wrong asset sent (must send '" + dAppAssetName) + "')")) | |
35 | - | else if ((dAppMinAmountToLend > i.payments[0].amount)) | |
36 | - | then throw((((("Insuffisent liquidity (minimum: " + toString(dAppMinAmountToLend)) + " ") + dAppAssetName) + ")")) | |
37 | - | else if ((this == i.caller)) | |
38 | - | then throw("dApp self sending is denied") | |
39 | - | else { | |
40 | - | let contractData = ((((toString(height) + "_") + toBase58String(dAppAssetId)) + "_") + toString(i.payments[0].amount)) | |
41 | - | let newLendingPoolStack = (getLendingPoolStack() + i.payments[0].amount) | |
42 | - | let issueContract = Issue(("ContractL_" + dAppAssetName), contractData, 1, 0, false) | |
43 | - | let issueContractId = calculateAssetId(issueContract) | |
44 | - | [IntegerEntry("lendingPoolStack", newLendingPoolStack), issueContract, ScriptTransfer(i.caller, issueContract.quantity, issueContractId)] | |
45 | - | } | |
46 | - | ||
47 | - | ||
48 | - | ||
49 | - | @Callable(i) | |
50 | - | func borrow (requestBorrowAmount) = if ((size(i.payments) != 1)) | |
51 | - | then throw("No payment attached") | |
52 | - | else if ((i.payments[0].assetId != dAppAssetId)) | |
53 | - | then throw((("Wrong asset sent (must send '" + dAppAssetName) + "')")) | |
54 | - | else if ((this == i.caller)) | |
55 | - | then throw("dApp self sending is denied") | |
56 | - | else if ((dAppMinAmountToBorrow > requestBorrowAmount)) | |
57 | - | then throw(((("Minimum amount to borrow is " + toString(dAppMinAmountToBorrow)) + " ") + dAppAssetName)) | |
58 | - | else if ((requestBorrowAmount > assetBalance(this, dAppAssetId))) | |
59 | - | then throw("Not enough liquidity available") | |
35 | + | else if ((this == i.caller)) | |
36 | + | then throw("dApp self sending is denied") | |
37 | + | else if ((isWavesAsset(i.payments[0].assetId) == false)) | |
38 | + | then throw("Payment should be in WAVES") | |
39 | + | else { | |
40 | + | let governorCreationPrice = match getInteger(this, "governorCreationPrice") { | |
41 | + | case val: Int => | |
42 | + | val | |
43 | + | case null => | |
44 | + | 0 | |
45 | + | } | |
46 | + | if ((i.payments[0].amount != governorCreationPrice)) | |
47 | + | then throw((((("Not a valid amount sent (you sent " + toString((i.payments[0].amount / 100000000))) + " WAVES instead of ") + toString((governorCreationPrice / 10000000))) + " WAVES)")) | |
60 | 48 | else { | |
61 | - | let minToReceiveFromBorrower = (requestBorrowAmount + ((requestBorrowAmount * dAppMinBorrowFeePerc) / 100)) | |
62 | - | if ((minToReceiveFromBorrower > i.payments[0].amount)) | |
63 | - | then throw((("Insuffisent collateral (must be " + toString(minToReceiveFromBorrower)) + "% higher than the request)")) | |
64 | - | else { | |
65 | - | let amountToDispatchInFeePool = (i.payments[0].amount - requestBorrowAmount) | |
66 | - | let newLendingPoolStack = (getLendingPoolStack() + requestBorrowAmount) | |
67 | - | let newFeePoolStack = (getFeePoolStack() + amountToDispatchInFeePool) | |
68 | - | let contractData = ((((((toString(height) + "_") + toBase58String(dAppAssetId)) + "_") + toString(requestBorrowAmount)) + "_") + toString(amountToDispatchInFeePool)) | |
69 | - | let issueContract = Issue(("ContractB_" + dAppAssetName), contractData, 1, 0, false) | |
70 | - | let issueContractId = calculateAssetId(issueContract) | |
71 | - | [IntegerEntry("lendingPoolStack", newLendingPoolStack), IntegerEntry("feePoolStack", newFeePoolStack), issueContract, ScriptTransfer(i.caller, issueContract.quantity, issueContractId), ScriptTransfer(i.caller, requestBorrowAmount, dAppAssetId)] | |
72 | - | } | |
49 | + | let govContract = Issue("GovernorContract", toString(height), 1, 0, false) | |
50 | + | let govContractId = calculateAssetId(govContract) | |
51 | + | [StringEntry("Treasury-WAVES", toString((getTreasury(unit) + i.payments[0].amount))), govContract, ScriptTransfer(i.caller, govContract.quantity, govContractId)] | |
73 | 52 | } | |
53 | + | } | |
74 | 54 | ||
75 | 55 | ||
76 | 56 | @Verifier(tx) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let dAppAssetName = "test1" | |
5 | - | ||
6 | - | let dAppAssetId = base58'CyRPSWqSzLmynv4W4REGjqhEefZVg2ZobVbvTLi71UzN' | |
7 | - | ||
8 | - | let dAppMinAmountToLend = 500 | |
9 | - | ||
10 | - | let dAppMinAmountToBorrow = 100 | |
11 | - | ||
12 | - | let dAppMinBorrowFeePerc = 10 | |
13 | - | ||
14 | - | func getLendingPoolStack () = match getInteger(this, "lendingPoolStack") { | |
15 | - | case a: Int => | |
16 | - | a | |
4 | + | func isWavesAsset (assetId) = match assetId { | |
5 | + | case asset: ByteVector => | |
6 | + | false | |
7 | + | case waves: Unit => | |
8 | + | true | |
17 | 9 | case _ => | |
18 | - | | |
10 | + | throw("Match error") | |
19 | 11 | } | |
20 | 12 | ||
21 | 13 | ||
22 | - | func getFeePoolStack () = match getInteger(this, "feePoolStack") { | |
23 | - | case a: Int => | |
24 | - | a | |
25 | - | case _ => | |
26 | - | 0 | |
27 | - | } | |
14 | + | func getTreasury (assetId) = { | |
15 | + | let treasuryName = match assetId { | |
16 | + | case asset: ByteVector => | |
17 | + | ("Treasury-" + toBase58String(asset)) | |
18 | + | case waves: Unit => | |
19 | + | "Treasury-WAVES" | |
20 | + | case _ => | |
21 | + | throw("Match error") | |
22 | + | } | |
23 | + | match getInteger(this, treasuryName) { | |
24 | + | case val: Int => | |
25 | + | val | |
26 | + | case null => | |
27 | + | 0 | |
28 | + | } | |
29 | + | } | |
28 | 30 | ||
29 | 31 | ||
30 | 32 | @Callable(i) | |
31 | - | func | |
33 | + | func createGovernor () = if ((size(i.payments) != 1)) | |
32 | 34 | then throw("No payment attached") | |
33 | - | else if ((i.payments[0].assetId != dAppAssetId)) | |
34 | - | then throw((("Wrong asset sent (must send '" + dAppAssetName) + "')")) | |
35 | - | else if ((dAppMinAmountToLend > i.payments[0].amount)) | |
36 | - | then throw((((("Insuffisent liquidity (minimum: " + toString(dAppMinAmountToLend)) + " ") + dAppAssetName) + ")")) | |
37 | - | else if ((this == i.caller)) | |
38 | - | then throw("dApp self sending is denied") | |
39 | - | else { | |
40 | - | let contractData = ((((toString(height) + "_") + toBase58String(dAppAssetId)) + "_") + toString(i.payments[0].amount)) | |
41 | - | let newLendingPoolStack = (getLendingPoolStack() + i.payments[0].amount) | |
42 | - | let issueContract = Issue(("ContractL_" + dAppAssetName), contractData, 1, 0, false) | |
43 | - | let issueContractId = calculateAssetId(issueContract) | |
44 | - | [IntegerEntry("lendingPoolStack", newLendingPoolStack), issueContract, ScriptTransfer(i.caller, issueContract.quantity, issueContractId)] | |
45 | - | } | |
46 | - | ||
47 | - | ||
48 | - | ||
49 | - | @Callable(i) | |
50 | - | func borrow (requestBorrowAmount) = if ((size(i.payments) != 1)) | |
51 | - | then throw("No payment attached") | |
52 | - | else if ((i.payments[0].assetId != dAppAssetId)) | |
53 | - | then throw((("Wrong asset sent (must send '" + dAppAssetName) + "')")) | |
54 | - | else if ((this == i.caller)) | |
55 | - | then throw("dApp self sending is denied") | |
56 | - | else if ((dAppMinAmountToBorrow > requestBorrowAmount)) | |
57 | - | then throw(((("Minimum amount to borrow is " + toString(dAppMinAmountToBorrow)) + " ") + dAppAssetName)) | |
58 | - | else if ((requestBorrowAmount > assetBalance(this, dAppAssetId))) | |
59 | - | then throw("Not enough liquidity available") | |
35 | + | else if ((this == i.caller)) | |
36 | + | then throw("dApp self sending is denied") | |
37 | + | else if ((isWavesAsset(i.payments[0].assetId) == false)) | |
38 | + | then throw("Payment should be in WAVES") | |
39 | + | else { | |
40 | + | let governorCreationPrice = match getInteger(this, "governorCreationPrice") { | |
41 | + | case val: Int => | |
42 | + | val | |
43 | + | case null => | |
44 | + | 0 | |
45 | + | } | |
46 | + | if ((i.payments[0].amount != governorCreationPrice)) | |
47 | + | then throw((((("Not a valid amount sent (you sent " + toString((i.payments[0].amount / 100000000))) + " WAVES instead of ") + toString((governorCreationPrice / 10000000))) + " WAVES)")) | |
60 | 48 | else { | |
61 | - | let minToReceiveFromBorrower = (requestBorrowAmount + ((requestBorrowAmount * dAppMinBorrowFeePerc) / 100)) | |
62 | - | if ((minToReceiveFromBorrower > i.payments[0].amount)) | |
63 | - | then throw((("Insuffisent collateral (must be " + toString(minToReceiveFromBorrower)) + "% higher than the request)")) | |
64 | - | else { | |
65 | - | let amountToDispatchInFeePool = (i.payments[0].amount - requestBorrowAmount) | |
66 | - | let newLendingPoolStack = (getLendingPoolStack() + requestBorrowAmount) | |
67 | - | let newFeePoolStack = (getFeePoolStack() + amountToDispatchInFeePool) | |
68 | - | let contractData = ((((((toString(height) + "_") + toBase58String(dAppAssetId)) + "_") + toString(requestBorrowAmount)) + "_") + toString(amountToDispatchInFeePool)) | |
69 | - | let issueContract = Issue(("ContractB_" + dAppAssetName), contractData, 1, 0, false) | |
70 | - | let issueContractId = calculateAssetId(issueContract) | |
71 | - | [IntegerEntry("lendingPoolStack", newLendingPoolStack), IntegerEntry("feePoolStack", newFeePoolStack), issueContract, ScriptTransfer(i.caller, issueContract.quantity, issueContractId), ScriptTransfer(i.caller, requestBorrowAmount, dAppAssetId)] | |
72 | - | } | |
49 | + | let govContract = Issue("GovernorContract", toString(height), 1, 0, false) | |
50 | + | let govContractId = calculateAssetId(govContract) | |
51 | + | [StringEntry("Treasury-WAVES", toString((getTreasury(unit) + i.payments[0].amount))), govContract, ScriptTransfer(i.caller, govContract.quantity, govContractId)] | |
73 | 52 | } | |
53 | + | } | |
74 | 54 | ||
75 | 55 | ||
76 | 56 | @Verifier(tx) | |
77 | 57 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
78 | 58 |
github/deemru/w8io/169f3d6 29.33 ms ◑![]()