From 701093bc155894b4b48e530d0efe6febe0173639 Mon Sep 17 00:00:00 2001 From: bra1nsurfer Date: Mon, 18 Sep 2023 15:18:38 +0300 Subject: [PATCH 1/5] wxdefi-469: amp keys --- ride/factory_v2.ride | 43 ++++++++++++++++++++++++++++++++++++++++++- ride/lp_stable.ride | 43 +++++-------------------------------------- 2 files changed, 47 insertions(+), 39 deletions(-) diff --git a/ride/factory_v2.ride b/ride/factory_v2.ride index 8a642c97..fa6993d9 100644 --- a/ride/factory_v2.ride +++ b/ride/factory_v2.ride @@ -176,6 +176,15 @@ func keyMinBalance(poolAddress: String, assetId: String) func keyMinBalanceDefault(assetId: String) = makeString(["%s%s", "minBalanceDefault", assetId], SEP) +# keyAmplification +func amp(poolAddress: String) + = makeString(["%s%s", "amp", poolAddress], SEP) +func keyAmpHistory(poolAddress: String, heightBlocks: Int) + = makeString(["%s%s%d", "amp", poolAddress, heightBlocks.toString()], SEP) +func keyChangeAmpLastCall(poolAddress: String) + = makeString(["%s%s", "changeAmpLastCall", poolAddress], SEP) +let ampInitial = 50 + #------------------------ # GLOBAL FUNCTIONS #------------------------ @@ -661,7 +670,9 @@ func activateNewPool(poolAddress: String, amountAssetStr: String, priceAssetStr: StringEntry(keyMappingPoolLPAssetToPoolContractAddress(lpAssetIdStr), poolAddress), StringEntry(keyMappingPoolContractToLPAsset(poolAddress), lpAssetIdStr), IntegerEntry(keyPoolToWeight(poolAddress),poolWeight), - IntegerEntry(keyPoolSpread(poolAddress),defaultSpread) + IntegerEntry(keyPoolSpread(poolAddress),defaultSpread), + StringEntry(amp(poolAddress), ampInitial.toString()), + StringEntry(keyAmpHistory(poolAddress, height), ampInitial.toString()) ] , lpAssetIdStr ) @@ -862,6 +873,36 @@ func onVerificationLoss(assetId: String) = { (nil, unit) } +@Callable(i) +func changeAmp(poolAddress: String) = { + let delay = keyChangeAmpDelay(poolAddress).getIntegerValue() + let delta = keyChangeAmpDelta(poolAddress).getIntegerValue() + let target = keyChangeAmpTarget(poolAddress).getIntegerValue() + + let curAmp = amp(poolAddress).getStringValue().parseIntValue() + let newAmpRaw = curAmp + delta + # to not increment/decrement too much + let newAmp = if (delta < 0) then { + if (newAmpRaw < target) then target else newAmpRaw + } else { + if (newAmpRaw > target) then target else newAmpRaw + } + + let lastCall = keyChangeAmpLastCall(poolAddress).getInteger().valueOrElse(0) + let wait = lastCall+delay + + strict checks = [ + height > wait || "try again in few blocks".throwErr(), + curAmp != newAmp || "already reached target".throwErr() + ] + + [ + IntegerEntry(keyChangeAmpLastCall(poolAddress), height), + StringEntry(amp(poolAddress), newAmp.toString()), + StringEntry(keyAmpHistory(poolAddress, height), newAmp.toString()) + ] +} + @Callable(i) func isPoolOneTokenOperationsDisabledREADONLY(poolAddress: String) = { let poolConfig = poolAddress.getPoolConfig() diff --git a/ride/lp_stable.ride b/ride/lp_stable.ride index cc4c4441..781c2d29 100644 --- a/ride/lp_stable.ride +++ b/ride/lp_stable.ride @@ -47,7 +47,6 @@ let big3 = 3.toBigInt() let big4 = 4.toBigInt() let slippage4D = (scale8 - scale8 * 1 / scale8).toBigInt() # 9999999 or error of 0.0000001 let wavesString = "WAVES" -let ampInitial = 50 let Amult = "100" let Dconv = "1" # D convergence @@ -113,9 +112,7 @@ func gau(ua: String, txId: String) = "%s%s%s__G__" + ua + "__" + txId func aa() = {"%s__amountAsset"} func pa() = {"%s__priceAsset"} # keyAmplificator -func amp() = {"%s__amp"} -func keyAmpHistory(heightBlocks: Int) = "%s%d__amp__" + heightBlocks.toString() -func keyChangeAmpLastCall() = "%s__changeAmpLastCall" +func amp() = {["%s%s", "amp", this.toString()].makeString(SEP)} let keyFee = "%s__fee" let fee = this.getInteger(keyFee).valueOrElse(feeDefault) @@ -192,7 +189,7 @@ let fca = addressFromStringValue(strf(this, fc())) let inFee = fca.invoke("getInFeeREADONLY", [this.toString()], []).exactAs[Int] let outFee = fca.invoke("getOutFeeREADONLY", [this.toString()], []).exactAs[Int] -let A = strf(this, amp()) +let A = strf(fca, amp()) # isGlobalShutdown # check that global shutdown is take place @@ -1607,9 +1604,7 @@ func activate(amtAsStr: String, prAsStr: String) = { if (i.caller.toString() != fca.toString()) then throw("denied") else { ([ StringEntry(aa(),amtAsStr), - StringEntry(pa(),prAsStr), - StringEntry(amp(), ampInitial.toString()), - StringEntry(keyAmpHistory(height), ampInitial.toString()) + StringEntry(pa(),prAsStr) ], "success") } @@ -1717,36 +1712,8 @@ func estimateGetOperationWrapperREADONLY(txId58: String, pmtAsId: String, pmtLpA @Callable(i) func changeAmp() = { - let cfg = fca.invoke("getChangeAmpConfigREADONLY", [this.toString()], []) - let (delay, delta, target) = match cfg { - case list: List[Any] => { - (list[0].exactAs[Int], list[1].exactAs[Int], list[2].exactAs[Int]) - } - case _ => "invalid entry type".throwErr() - } - - let curAmp = amp().getStringValue().parseIntValue() - let newAmpRaw = curAmp + delta - # to not increment/decrement too much - let newAmp = if (delta < 0) then { - if (newAmpRaw < target) then target else newAmpRaw - } else { - if (newAmpRaw > target) then target else newAmpRaw - } - - let lastCall = keyChangeAmpLastCall().getInteger().valueOrElse(0) - let wait = lastCall+delay - - strict checks = [ - height > wait || "try again in few blocks".throwErr(), - curAmp != newAmp || "already reached target".throwErr() - ] - - [ - IntegerEntry(keyChangeAmpLastCall(), height), - StringEntry(amp(), newAmp.toString()), - StringEntry(keyAmpHistory(height), newAmp.toString()) - ] + strict fcaInv = fca.invoke("changeAmp", [this.toString()], []) + nil } @Verifier(tx) From 426f1fdd5d17289f1b572d3dbc078ec57ce08edb Mon Sep 17 00:00:00 2001 From: bra1nsurfer Date: Mon, 18 Sep 2023 16:26:58 +0300 Subject: [PATCH 2/5] Migration data tx --- .../01_factory_v2_data_tx.json | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 migrations/2023_09_18_amp_keys/01_factory_v2_data_tx.json diff --git a/migrations/2023_09_18_amp_keys/01_factory_v2_data_tx.json b/migrations/2023_09_18_amp_keys/01_factory_v2_data_tx.json new file mode 100644 index 00000000..abf4114e --- /dev/null +++ b/migrations/2023_09_18_amp_keys/01_factory_v2_data_tx.json @@ -0,0 +1,108 @@ +{ + "type": 12, + "fee": 500000, + "feeAssetId": null, + "version": 2, + "senderPublicKey": "HBWgh7DKPyzCnEXKJAJ5dKQ3jmPtMhGD78tt6jRdkV61", + "data": [ + { + "key": "%s%s__amp__3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__changeAmpLastCall__3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz", + "type": "integer", + "value": 3622973 + }, + { + "key": "%s%s__amp__3PC3HtupBxBmy4WtZf1Tym1vrxg9MwbZRK1", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__changeAmpLastCall__3PC3HtupBxBmy4WtZf1Tym1vrxg9MwbZRK1", + "type": "integer", + "value": 3622973 + }, + { + "key": "%s%s__amp__3P5hjCSDFRGabd7VN74AVPiKNqgAHm8JAbD", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__changeAmpLastCall__3P5hjCSDFRGabd7VN74AVPiKNqgAHm8JAbD", + "type": "integer", + "value": 3622973 + }, + { + "key": "%s%s__amp__3P4Dn8Ghz4QDH5SAL4xQi6cW2FhuKq6gnyC", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__changeAmpLastCall__3P4Dn8Ghz4QDH5SAL4xQi6cW2FhuKq6gnyC", + "type": "integer", + "value": 3622973 + }, + { + "key": "%s%s__amp__3P5VC7EqCZ3BsTuz3QrZFpxZ9VEm5N6WHTb", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__amp__3P5muaLnF5EB3QEZTzkPYFDBdMeH8EnNkXs", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__amp__3PAqRnZbZ9YQCs2kaq5fUdbvtaKCg9vw7hV", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__amp__3PJazesjmprZcXYcFx3LxBux9T7q6qYoEDu", + "value": "50" + }, + { + "key": "%s%s__amp__3P5muaLnF5EB3QEZTzkPYFDBdMeH8EnNkXs", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__amp__3PAqRnZbZ9YQCs2kaq5fUdbvtaKCg9vw7hV", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__amp__3PJazesjmprZcXYcFx3LxBux9T7q6qYoEDu", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__amp__3PDqijReU8yXKFfBGBrRjckzaAp5K8Sywhv", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__amp__3PBxqamajfw2cHR2wmv5usiWxBncKLdXVdu", + "type": "string", + "value": "100" + }, + { + "key": "%s%s__amp__3PQ4BZAPz3A8xApagrKHHAaBCipyXyMZfBD", + "type": "string", + "value": "100" + }, + { + "key": "%s%s__amp__3P5V29rzis25fDSpfgGWcDcLY1xxf7MfWRJ", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__amp__3P85eCEdGNPJaURRNo3bkrtYm8dhQ2r8tVY", + "type": "string", + "value": "50" + } + ] +} From e18a50f2b8fe0f2f3772e0ea3a0577149297cb10 Mon Sep 17 00:00:00 2001 From: bra1nsurfer Date: Tue, 19 Sep 2023 09:40:09 +0300 Subject: [PATCH 3/5] Added amp keys to delete function Updated tests --- ride/factory_v2.ride | 13 ++++++++----- test/components/lp_stable/_hooks.mjs | 7 ++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ride/factory_v2.ride b/ride/factory_v2.ride index fa6993d9..991e110c 100644 --- a/ride/factory_v2.ride +++ b/ride/factory_v2.ride @@ -177,7 +177,7 @@ func keyMinBalanceDefault(assetId: String) = makeString(["%s%s", "minBalanceDefault", assetId], SEP) # keyAmplification -func amp(poolAddress: String) +func keyAmp(poolAddress: String) = makeString(["%s%s", "amp", poolAddress], SEP) func keyAmpHistory(poolAddress: String, heightBlocks: Int) = makeString(["%s%s%d", "amp", poolAddress, heightBlocks.toString()], SEP) @@ -671,7 +671,7 @@ func activateNewPool(poolAddress: String, amountAssetStr: String, priceAssetStr: StringEntry(keyMappingPoolContractToLPAsset(poolAddress), lpAssetIdStr), IntegerEntry(keyPoolToWeight(poolAddress),poolWeight), IntegerEntry(keyPoolSpread(poolAddress),defaultSpread), - StringEntry(amp(poolAddress), ampInitial.toString()), + StringEntry(keyAmp(poolAddress), ampInitial.toString()), StringEntry(keyAmpHistory(poolAddress, height), ampInitial.toString()) ] , lpAssetIdStr @@ -879,7 +879,7 @@ func changeAmp(poolAddress: String) = { let delta = keyChangeAmpDelta(poolAddress).getIntegerValue() let target = keyChangeAmpTarget(poolAddress).getIntegerValue() - let curAmp = amp(poolAddress).getStringValue().parseIntValue() + let curAmp = keyAmp(poolAddress).getStringValue().parseIntValue() let newAmpRaw = curAmp + delta # to not increment/decrement too much let newAmp = if (delta < 0) then { @@ -898,7 +898,7 @@ func changeAmp(poolAddress: String) = { [ IntegerEntry(keyChangeAmpLastCall(poolAddress), height), - StringEntry(amp(poolAddress), newAmp.toString()), + StringEntry(keyAmp(poolAddress), newAmp.toString()), StringEntry(keyAmpHistory(poolAddress, height), newAmp.toString()) ] } @@ -1067,7 +1067,10 @@ func deletePool(poolContractAddress: String) = { DeleteEntry(keyChangeAmpDelay(poolContractAddress)), DeleteEntry(keyChangeAmpDelta(poolContractAddress)), - DeleteEntry(keyChangeAmpTarget(poolContractAddress)) + DeleteEntry(keyChangeAmpTarget(poolContractAddress)), + + DeleteEntry(keyAmp(poolContractAddress)), + DeleteEntry(keyChangeAmpLastCall(poolContractAddress)) ] } diff --git a/test/components/lp_stable/_hooks.mjs b/test/components/lp_stable/_hooks.mjs index 1460e4f8..f2e85071 100644 --- a/test/components/lp_stable/_hooks.mjs +++ b/test/components/lp_stable/_hooks.mjs @@ -205,7 +205,7 @@ export const mochaHooks = { type: 'integer', value: '100000', }, { - key: '$s__outFeeDefault', + key: '%s__outFeeDefault', type: 'integer', value: '100000', }], @@ -277,12 +277,13 @@ export const mochaHooks = { const setAmpTx = data({ additionalFee: 4e5, data: [{ - key: '%s__amp', + key: `%s%s__amp__${address(this.accounts.lpStable, chainId)}`, type: 'string', value: '250', }], chainId, - }, this.accounts.lpStable); + senderPublicKey: publicKey(this.accounts.factoryV2), + }, this.accounts.manager); await api.transactions.broadcast(setAmpTx, {}); await waitForTx(setAmpTx.id, { apiBase }); From 8216c0b1c9d9413efe3c537a41cc50e1c8ed3d3d Mon Sep 17 00:00:00 2001 From: bra1nsurfer Date: Tue, 19 Sep 2023 09:45:56 +0300 Subject: [PATCH 4/5] Update factory tests --- test/components/factory_v2/deletePoolByManager.spec.mjs | 8 ++++++++ test/components/factory_v2/deletePoolByUser.spec.mjs | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/test/components/factory_v2/deletePoolByManager.spec.mjs b/test/components/factory_v2/deletePoolByManager.spec.mjs index 3e2e4608..f8e18a6a 100644 --- a/test/components/factory_v2/deletePoolByManager.spec.mjs +++ b/test/components/factory_v2/deletePoolByManager.spec.mjs @@ -239,6 +239,14 @@ describe('Factory V2 - deletePool', /** @this {MochaSuiteModified} */() => { key: `%s%s__changeAmpTarget__${poolAddress}`, value: null, }, + { + key: `%s%s__amp__${poolAddress}`, + value: null, + }, + { + key: `%s%s__changeAmpLastCall__${poolAddress}`, + value: null, + }, ]); expect(stateChanges.invokes).to.containSubset([ diff --git a/test/components/factory_v2/deletePoolByUser.spec.mjs b/test/components/factory_v2/deletePoolByUser.spec.mjs index effcc51d..c477aa07 100644 --- a/test/components/factory_v2/deletePoolByUser.spec.mjs +++ b/test/components/factory_v2/deletePoolByUser.spec.mjs @@ -253,6 +253,14 @@ describe('Factory V2 - deletePool by pool creator', /** @this {MochaSuiteModifie key: `%s%s__changeAmpTarget__${poolAddress}`, value: null, }, + { + key: `%s%s__amp__${poolAddress}`, + value: null, + }, + { + key: `%s%s__changeAmpLastCall__${poolAddress}`, + value: null, + }, ]); expect(stateChanges.invokes).to.containSubset([ From b0b5d3cb1b95ae0f10308eeb0823a5eb5ea14ad6 Mon Sep 17 00:00:00 2001 From: bra1nsurfer Date: Mon, 6 Nov 2023 14:04:50 +0300 Subject: [PATCH 5/5] migration 2 --- .../02_factory_v2_amp_history_2.json | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 migrations/2023_09_18_amp_keys/02_factory_v2_amp_history_2.json diff --git a/migrations/2023_09_18_amp_keys/02_factory_v2_amp_history_2.json b/migrations/2023_09_18_amp_keys/02_factory_v2_amp_history_2.json new file mode 100644 index 00000000..6449f63d --- /dev/null +++ b/migrations/2023_09_18_amp_keys/02_factory_v2_amp_history_2.json @@ -0,0 +1,79 @@ +{ + "type": 12, + "fee": 500000, + "feeAssetId": null, + "version": 2, + "senderPublicKey": "HBWgh7DKPyzCnEXKJAJ5dKQ3jmPtMhGD78tt6jRdkV61", + "data": [ + { + "key": "%s%s%d__amp__3P8KMyAJCPWNcyedqrmymxaeWonvmkhGauz__3622973", + "type": "string", + "value": "50" + }, + { + "key": "%s%s%d__amp__3PC3HtupBxBmy4WtZf1Tym1vrxg9MwbZRK1__3622973", + "type": "string", + "value": "50" + }, + { + "key": "%s%s%d__amp__3P5hjCSDFRGabd7VN74AVPiKNqgAHm8JAbD__3622973", + "type": "string", + "value": "50" + }, + { + "key": "%s%s%d__amp__3P4Dn8Ghz4QDH5SAL4xQi6cW2FhuKq6gnyC__3622973", + "type": "string", + "value": "50" + }, + { + "key": "%s%s%d__amp__3P5VC7EqCZ3BsTuz3QrZFpxZ9VEm5N6WHTb__3034384", + "type": "string", + "value": "50" + }, + { + "key": "%s%s%d__amp__3P5muaLnF5EB3QEZTzkPYFDBdMeH8EnNkXs__3131379", + "type": "string", + "value": "50" + }, + { + "key": "%s%s%d__amp__3PAqRnZbZ9YQCs2kaq5fUdbvtaKCg9vw7hV__3131347", + "type": "string", + "value": "50" + }, + { + "key": "%s%s%d__amp__3PJazesjmprZcXYcFx3LxBux9T7q6qYoEDu__3131318", + "type": "string", + "value": "50" + }, + { + "key": "%s%s%d__amp__3PDqijReU8yXKFfBGBrRjckzaAp5K8Sywhv__3594323", + "type": "string", + "value": "50" + }, + { + "key": "%s%s%d__amp__3PBxqamajfw2cHR2wmv5usiWxBncKLdXVdu__3647513", + "type": "string", + "value": "100" + }, + { + "key": "%s%s%d__amp__3PQ4BZAPz3A8xApagrKHHAaBCipyXyMZfBD__3647513", + "type": "string", + "value": "100" + }, + { + "key": "%s%s%d__amp__3P5V29rzis25fDSpfgGWcDcLY1xxf7MfWRJ__3738380", + "type": "string", + "value": "50" + }, + { + "key": "%s%s%d__amp__3P85eCEdGNPJaURRNo3bkrtYm8dhQ2r8tVY__3800818", + "type": "string", + "value": "50" + }, + { + "key": "%s%s__amp__3P85eCEdGNPJaURRNo3bkrtYm8dhQ2r8tVY", + "type": "string", + "value": "50" + } + ] +}