From 0c563102cc8a1ce6067d08e20b36fa28e1c0a0e4 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 11:13:46 -0700 Subject: [PATCH 01/30] initial commit --- 0018-oracle-arb-fix.md | 92 ++++++++++++++++++++++++++++++++ 0018-oracle-arb-fix/meerkat.png | Bin 0 -> 87551 bytes 2 files changed, 92 insertions(+) create mode 100644 0018-oracle-arb-fix.md create mode 100644 0018-oracle-arb-fix/meerkat.png diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md new file mode 100644 index 000000000..d7f4e491f --- /dev/null +++ b/0018-oracle-arb-fix.md @@ -0,0 +1,92 @@ +# HIP17: Hex Density Based Transmit Reward Scaling + +- Author: [@lthiery](https://github.com/lthiery) +- Start Date: 2020-10-22 +- Category: Technical +- Original HIP PR: +- Tracking Issue: + +# Summary +[summary]: #summary +A new oracle price takes effect one hour in the future. The reason for this is to provide users with predictability when converting HNT to DC. + + If one is trying to “sweep” all HNT from one wallet to another, one can leave just enough HNT to cover the transaction fee via implicit burn + If you are converting HNT into DC, you can know with relative certainty that your burn will yield a certain amount of DCs + + Unfortunately, this delay provides an on-chain arbitrage opportunity via state channels. Given the delay, an actor with HNT in-hand may see the forecasted drop in HNT price and thus convert HNT into DCs. Afterok the drop takes effect, the actor may then “spend” the DCs in a state channel, naming a colluding gateway of theirs as the beneficiary. Effectively, the actor is burning and minting HNT on-chain with very little risk. + + To demonstrate the “oracle arbitrage opportunity”, consider the following example: + * At block 200, the current oracle price is $1.1 + * Submitted oracle prices will set the new oracle price to $1; this will take effect in one hour or roughly at block 260 + * Between block 200 and block 260, the actor may burn 1000 HNT, yielding $1100 worth of DC + * After block 260, the actor my close a state channel naming its colluding gateway as beneficiary of $1100 worth of DC, assuming: + * the grace period on the state channel has expired + * the oracle price has not changed again + *The DC reward pool has not been maxed out + + ⇒ the colluding gateway is awarded 1100 HNT + + +# Example +[example]: #example + +Example + +The Dapper-Hickory-Meerkat, managed by [wallet 13ZiB74TJNdV5D5VFehEH3oMSuFNusjkho4gJYmnRmLRnXrZbE5](https://explorer.helium.com/accounts/13ZiB74TJNdV5D5VFehEH3oMSuFNusjkho4gJYmnRmLRnXrZbE5), has recently exploited this opportunity. + +Here it is graphed from on-chain data showing HNT burn events, mining rewards from DC and what the oracle price was for all of these events: + +![image MeerkatBurnAndMint](./0018-oracle-arb-fix/meerkat.png) + + +As you can see, “the big burn” of about 27k HNT was burned right before the oracle price dropped from about $1.2 to $1.1. Over time, the DC was “minted” back into HNT via the DC rewards. + +It’s worth noting, despite the magnitude of burn and mint, at the time of this writing, only about 2k HNT was cleared by the owner of the Meerkat. Therefore, you could approximate: +* 27k HNT was burned +* 29k HNT was minted + +While only 2k HNT was cleared, another side-effect of the arbitrage is that the Proof-of-Coverage (POC) earnings during the period of the mint back were severely impacted as when the DC reward pool grows, it grows at the expense of POC rewards during that same epoch. + +It’s also worth noting that the mint back took roughly 24 hours, so should the market price and then the oracle price have snapped back, the Meerkat may have lost out. The severe price drop may also be an artifact due to manual entry of oracle prices. This will not be the focus of this HIP but remains noteworthy and perhaps the subject matter for future HIPs. + + +# Winners and Losers as Is +[winners-and-losers-as-is]: #winners-and-losers-as-is + +So who gains what from this opportunity? As previously stated, the owner of the Meerkat’s wallet has cleared about 2k HNT. The rest of the HNT in play was essentially burned and redeemed; in effect, HNT emissions were cut by about 30% during the 24 hour period of mint back. In a direct sense, this benefits: +* Current holders of HNT: effectively, inflation has been curbed +* non-POC earners: their emissions have not been affected + +# Solution +[solution]: #solution +The opportunity for arbitrage is that the oracle price is forecasted to change before it actually changes. As previously mentioned, oracle reporting and oracle price adjustment may be compounding factors but are not the concern of the solution to be proposed herein. + +**The proposed solution is to make HNT to DC conversion for transactions based on the minimum of previous prices and dynamic price and to force burn transactions to accept a dynamic conversion rate along with a maximum acceptable conversion rate.** + +Since transaction fees are relatively insignificant in the economics of the Helium blockchain, allowing for “opportunistic” transactions should not affect things the way that burning HNT for DC does. Thus allowing a minimum of previous and dynamic previous gives the same desired ease of use. + +For HNT to DC conversion, the dynamic price essentially means that any oracle price changes may change one’s conversion rate. In general, the DC burn transaction is only useful for OUI operators or facilitators of these parties. As such, we may expect a level of sophistication from these actors relative to regular wallet holders or miners who simply wish to transact funds. + +However, to mitigate the impact of the dynamic price, we suggest the ability for dc_transactions_v2 to also stipulate a maximum oracle conversion rate. This will afford a level of assurance for these transactions with regards to oracle and market price volatility. + +# Impact +[impact]: #impact + +So who gains what from this solution? While this solution is admittedly not the simplest from an implementation perspective, it attempts to resolve the logical existence of the arbitrage without affecting reward policy (no economic impact other than closing the arb) and without losing predictability in transaction fees. + +In effect, it simply tries to take the “forward looking window” that oracle prices provide for transaction fees and instead provide a “backwards looking window”, along with the potential to pay less if by chance the oracle price goes down after submission. + +One minor drawback here is that someone wishing to “sweep” the contents out of a wallet might get a better deal than anticipated and would leave some dust (a few bones) behind. This could be addressed in the future with a specific sweep transaction which would indicate “empty the wallet to this wallet”, thus leaving no dust behind. + +The biggest downside of this solution is an increase in complexity for the burn transaction as the user does not know ahead of time what the cost will be; the maximum conversion rate is added to the transaction, however, which provides a bounded conversion rate. + +#Alternate Solutions +[alternate-solutions]: #alternate-solutions + +##Delayed HNT Burn +Delayed burn is not logically that different from the proposal here, except instead of releasing the DC immediately, the DC would be held until the future oracle price takes effect. The downside of this approach is DCs cannot be created without the delay which may be considered + +##1.1:1 DC to HNT Conversion +Currently, DC rewards are determined by converting DC earned for a gateway into HNT at a 1:1 rate. Assuming the total HNT earned via DC rewards during the epoch is within the allocated percentage, the HNT rewarded is worth exactly the amount of DC earned by that gateway during the epoch. Recall that the 1:1 conversion was determined as a countermeasure to the DC spamming in August 2020, where traffic was low enough and so far below equilibrium, that every DC spent was effectively rewarding gateways 1:100 to 1:1000. + +While this solution would effectively negate the arbitrage opportunity, it has a secondary economic impact of decreasing the earning potential of gateways that forward network data, which is precisely the reason for the Helium Network to exist. In fact, before DC spamming made the flaw in incentives apparent, we very much wanted to reward a large slice to gateways that were forwarding data. diff --git a/0018-oracle-arb-fix/meerkat.png b/0018-oracle-arb-fix/meerkat.png new file mode 100644 index 0000000000000000000000000000000000000000..419808f11d83487081313899dc67babdceff7052 GIT binary patch literal 87551 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

nAvFS8|B7p#(msdhomOk^QvV8#4 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 =u{0yisEgNqgwcHPdf8X8i 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 Jf%vO;{|`?3gx>%F literal 0 HcmV?d00001 From 7f5de521c252d98bc06d1262c7e43996f557a71e Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 11:16:29 -0700 Subject: [PATCH 02/30] add original HIP PR to header --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index d7f4e491f..1c8253654 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -3,7 +3,7 @@ - Author: [@lthiery](https://github.com/lthiery) - Start Date: 2020-10-22 - Category: Technical -- Original HIP PR: +- Original HIP PR: [#59](https://github.com/helium/HIP/pull/62) - Tracking Issue: # Summary From d8bcedbb17321896e4e2fbc1edbdb17c2075cd46 Mon Sep 17 00:00:00 2001 From: Jamie Wilkinson Date: Thu, 22 Oct 2020 14:20:54 -0400 Subject: [PATCH 03/30] Rename title --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 1c8253654..ceb8feded 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -1,4 +1,4 @@ -# HIP17: Hex Density Based Transmit Reward Scaling +# HIPxx: Oracle Arbitrage Fix - Author: [@lthiery](https://github.com/lthiery) - Start Date: 2020-10-22 From ffcb096741d87a6be9fe0ecf89d68cdb73f0c60e Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 11:29:37 -0700 Subject: [PATCH 04/30] formatting --- 0018-oracle-arb-fix.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 1c8253654..c7ea183f1 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -80,13 +80,13 @@ One minor drawback here is that someone wishing to “sweep” the contents out The biggest downside of this solution is an increase in complexity for the burn transaction as the user does not know ahead of time what the cost will be; the maximum conversion rate is added to the transaction, however, which provides a bounded conversion rate. -#Alternate Solutions +# Alternate Solutions [alternate-solutions]: #alternate-solutions -##Delayed HNT Burn +## Delayed HNT Burn Delayed burn is not logically that different from the proposal here, except instead of releasing the DC immediately, the DC would be held until the future oracle price takes effect. The downside of this approach is DCs cannot be created without the delay which may be considered -##1.1:1 DC to HNT Conversion +## 1.1:1 DC to HNT Conversion Currently, DC rewards are determined by converting DC earned for a gateway into HNT at a 1:1 rate. Assuming the total HNT earned via DC rewards during the epoch is within the allocated percentage, the HNT rewarded is worth exactly the amount of DC earned by that gateway during the epoch. Recall that the 1:1 conversion was determined as a countermeasure to the DC spamming in August 2020, where traffic was low enough and so far below equilibrium, that every DC spent was effectively rewarding gateways 1:100 to 1:1000. While this solution would effectively negate the arbitrage opportunity, it has a secondary economic impact of decreasing the earning potential of gateways that forward network data, which is precisely the reason for the Helium Network to exist. In fact, before DC spamming made the flaw in incentives apparent, we very much wanted to reward a large slice to gateways that were forwarding data. From cbbf8ff7c8568103e5f6c82c7360212b68bce7ac Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 11:30:50 -0700 Subject: [PATCH 05/30] fix sentence --- 0018-oracle-arb-fix.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index fca24e34c..eceec6fed 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -84,8 +84,7 @@ The biggest downside of this solution is an increase in complexity for the burn [alternate-solutions]: #alternate-solutions ## Delayed HNT Burn -Delayed burn is not logically that different from the proposal here, except instead of releasing the DC immediately, the DC would be held until the future oracle price takes effect. The downside of this approach is DCs cannot be created without the delay which may be considered - +Delayed burn is not logically that different from the proposal here, except instead of releasing the DC immediately, the DC would be held until the future oracle price takes effect. The downside of this approach is DCs cannot be created without a delay and thus a user must wait for DCs when they may need them quickly. ## 1.1:1 DC to HNT Conversion Currently, DC rewards are determined by converting DC earned for a gateway into HNT at a 1:1 rate. Assuming the total HNT earned via DC rewards during the epoch is within the allocated percentage, the HNT rewarded is worth exactly the amount of DC earned by that gateway during the epoch. Recall that the 1:1 conversion was determined as a countermeasure to the DC spamming in August 2020, where traffic was low enough and so far below equilibrium, that every DC spent was effectively rewarding gateways 1:100 to 1:1000. From 8be94b8b68e41a85641a7269a4aea4c0cd096b1b Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 11:53:27 -0700 Subject: [PATCH 06/30] examples of solution --- 0018-oracle-arb-fix.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index eceec6fed..f5d3429e3 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -49,7 +49,6 @@ While only 2k HNT was cleared, another side-effect of the arbitrage is that the It’s also worth noting that the mint back took roughly 24 hours, so should the market price and then the oracle price have snapped back, the Meerkat may have lost out. The severe price drop may also be an artifact due to manual entry of oracle prices. This will not be the focus of this HIP but remains noteworthy and perhaps the subject matter for future HIPs. - # Winners and Losers as Is [winners-and-losers-as-is]: #winners-and-losers-as-is @@ -69,6 +68,33 @@ For HNT to DC conversion, the dynamic price essentially means that any oracle pr However, to mitigate the impact of the dynamic price, we suggest the ability for dc_transactions_v2 to also stipulate a maximum oracle conversion rate. This will afford a level of assurance for these transactions with regards to oracle and market price volatility. +# Examples with Solution Implemented +[examples-with-solution-implemented]: #examples-with-solution-implemented + +## Failed Burn + +* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1 and the *maximum conversion price set is $1*. +* At block 201, a new oracle price of $1.1. +* The token burn transaction is now invalid and will be dropped. It could theoretically be rebroadcast at a later time or the user could submit a new transaction with the same nonce to invalidate the transaction. + +## Successful Burn + +* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1 and the *maximum conversion price set is $1.1*. +* At block 201, enough oracle reports set an instantly new oracle price of $1.1. The token burn transaction remains valid. + +## Payment Transaction + +* Fees are set to allow the best price in the previous 100 blocks +* A user submits a payment of 1 HNT to another address. Going back 100 blocks, the lowest oracle price is 50 blocks ago at $1 and current oracle price is $1.1. +* If the transaction is processed within 50 blocks, the $1 oracle price is honored and 0.35 HNT is withdrawn from the account to cover the $0.35 fee + +## Payment Transaction with Surprise Discount + +* Fees are set to allow the best price in the previous 100 blocks +* A user submits a payment of 1 HNT to another address. Going back 100 blocks, the lowest oracle price is 50 blocks ago at $1 +* After submission but before the transaction is processed, a new price of $0.5 is issued +* The $0.5 oracle price is honored and 0.175 HNT is withdrawn from the account to cover the $0.35 fee + # Impact [impact]: #impact From 9f8685c9276499c148adddeee954d6cd9eac8e94 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 11:55:05 -0700 Subject: [PATCH 07/30] give HIP a number --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index f5d3429e3..f95e55938 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -1,4 +1,4 @@ -# HIPxx: Oracle Arbitrage Fix +# HIP18: Oracle Arbitrage Fix - Author: [@lthiery](https://github.com/lthiery) - Start Date: 2020-10-22 From 56e867bb72e1cdedb45d56cf784474f386b0b01b Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 11:56:03 -0700 Subject: [PATCH 08/30] typo --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index f95e55938..d04f4766b 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -13,7 +13,7 @@ A new oracle price takes effect one hour in the future. The reason for this is t If one is trying to “sweep” all HNT from one wallet to another, one can leave just enough HNT to cover the transaction fee via implicit burn If you are converting HNT into DC, you can know with relative certainty that your burn will yield a certain amount of DCs - Unfortunately, this delay provides an on-chain arbitrage opportunity via state channels. Given the delay, an actor with HNT in-hand may see the forecasted drop in HNT price and thus convert HNT into DCs. Afterok the drop takes effect, the actor may then “spend” the DCs in a state channel, naming a colluding gateway of theirs as the beneficiary. Effectively, the actor is burning and minting HNT on-chain with very little risk. + Unfortunately, this delay provides an on-chain arbitrage opportunity via state channels. Given the delay, an actor with HNT in-hand may see the forecasted drop in HNT price and thus convert HNT into DCs. After the drop takes effect, the actor may then “spend” the DCs in a state channel, naming a colluding gateway of theirs as the beneficiary. Effectively, the actor is burning and minting HNT on-chain with very little risk. To demonstrate the “oracle arbitrage opportunity”, consider the following example: * At block 200, the current oracle price is $1.1 From a583bd8c8485941db05580593556c39e19a943fc Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 11:56:46 -0700 Subject: [PATCH 09/30] formatting again --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index d04f4766b..40d30ce4b 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -22,7 +22,7 @@ A new oracle price takes effect one hour in the future. The reason for this is t * After block 260, the actor my close a state channel naming its colluding gateway as beneficiary of $1100 worth of DC, assuming: * the grace period on the state channel has expired * the oracle price has not changed again - *The DC reward pool has not been maxed out + * the DC reward pool has not been maxed out ⇒ the colluding gateway is awarded 1100 HNT From 06527e6576a76107f28ea6c73b250998f45eb093 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 11:57:03 -0700 Subject: [PATCH 10/30] extra words --- 0018-oracle-arb-fix.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 40d30ce4b..7dd76f7b7 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -30,8 +30,6 @@ A new oracle price takes effect one hour in the future. The reason for this is t # Example [example]: #example -Example - The Dapper-Hickory-Meerkat, managed by [wallet 13ZiB74TJNdV5D5VFehEH3oMSuFNusjkho4gJYmnRmLRnXrZbE5](https://explorer.helium.com/accounts/13ZiB74TJNdV5D5VFehEH3oMSuFNusjkho4gJYmnRmLRnXrZbE5), has recently exploited this opportunity. Here it is graphed from on-chain data showing HNT burn events, mining rewards from DC and what the oracle price was for all of these events: From a5a1ade393ceecf7ed858d427a0efefa169b2e5f Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 11:59:46 -0700 Subject: [PATCH 11/30] rephrase --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 7dd76f7b7..70e4aa8a7 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -58,7 +58,7 @@ So who gains what from this opportunity? As previously stated, the owner of the [solution]: #solution The opportunity for arbitrage is that the oracle price is forecasted to change before it actually changes. As previously mentioned, oracle reporting and oracle price adjustment may be compounding factors but are not the concern of the solution to be proposed herein. -**The proposed solution is to make HNT to DC conversion for transactions based on the minimum of previous prices and dynamic price and to force burn transactions to accept a dynamic conversion rate along with a maximum acceptable conversion rate.** +**The proposed solution is to make HNT to DC conversion for transaction fees to be based on the minimum of (previous prices and dynamic price) and to force burn transactions to accept a dynamic conversion rate, as long as it is below the transactions maximum acceptable conversion rate.** Since transaction fees are relatively insignificant in the economics of the Helium blockchain, allowing for “opportunistic” transactions should not affect things the way that burning HNT for DC does. Thus allowing a minimum of previous and dynamic previous gives the same desired ease of use. From 8c4a93c28c6a9488b8b51b0d230753a081d52366 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 12:01:11 -0700 Subject: [PATCH 12/30] fix phrasing again --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 70e4aa8a7..db25b78aa 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -60,7 +60,7 @@ The opportunity for arbitrage is that the oracle price is forecasted to change b **The proposed solution is to make HNT to DC conversion for transaction fees to be based on the minimum of (previous prices and dynamic price) and to force burn transactions to accept a dynamic conversion rate, as long as it is below the transactions maximum acceptable conversion rate.** -Since transaction fees are relatively insignificant in the economics of the Helium blockchain, allowing for “opportunistic” transactions should not affect things the way that burning HNT for DC does. Thus allowing a minimum of previous and dynamic previous gives the same desired ease of use. +Since transaction fees are relatively insignificant in the economics of the Helium blockchain, allowing for “opportunistic” transactions should not affect things the way that burning HNT for DC does. Thus allowing a minimum of (previous prices and dynamic future prices) gives the same desired ease of use, with perhaps a surprise of paying less. For HNT to DC conversion, the dynamic price essentially means that any oracle price changes may change one’s conversion rate. In general, the DC burn transaction is only useful for OUI operators or facilitators of these parties. As such, we may expect a level of sophistication from these actors relative to regular wallet holders or miners who simply wish to transact funds. From 75b9db8a9313f2b4bc9089de62f546a1cb8335d7 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 12:01:52 -0700 Subject: [PATCH 13/30] phrasing --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index db25b78aa..1f373e598 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -72,7 +72,7 @@ However, to mitigate the impact of the dynamic price, we suggest the ability for ## Failed Burn * A user submits a token burn right after block 200 is forged. Oracle price at that time is $1 and the *maximum conversion price set is $1*. -* At block 201, a new oracle price of $1.1. +* At block 201, a new oracle price of $1.1 is established. * The token burn transaction is now invalid and will be dropped. It could theoretically be rebroadcast at a later time or the user could submit a new transaction with the same nonce to invalidate the transaction. ## Successful Burn From f44fc3914f29de865233d3c57ac4f1eb0b9189d7 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Thu, 22 Oct 2020 12:02:53 -0700 Subject: [PATCH 14/30] phrasing --- 0018-oracle-arb-fix.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 1f373e598..b953ee4d3 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -72,8 +72,8 @@ However, to mitigate the impact of the dynamic price, we suggest the ability for ## Failed Burn * A user submits a token burn right after block 200 is forged. Oracle price at that time is $1 and the *maximum conversion price set is $1*. -* At block 201, a new oracle price of $1.1 is established. -* The token burn transaction is now invalid and will be dropped. It could theoretically be rebroadcast at a later time or the user could submit a new transaction with the same nonce to invalidate the transaction. +* At block 201, a new oracle price of $1.1 is established and the Burn transaction is not in this block. +* At block 202, The token burn transaction is now invalid and will be dropped. It could theoretically be rebroadcast at a later time or the user could submit a new transaction with the same nonce to invalidate the transaction. ## Successful Burn From 4f3b7ad999ef7ab2455989808e8ba9974a1e06a4 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Fri, 23 Oct 2020 08:20:29 -0700 Subject: [PATCH 15/30] a flurry of formatting --- 0018-oracle-arb-fix.md | 121 +++++++++++++++++++++++++++++------------ 1 file changed, 86 insertions(+), 35 deletions(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index b953ee4d3..f65050996 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -8,23 +8,30 @@ # Summary [summary]: #summary -A new oracle price takes effect one hour in the future. The reason for this is to provide users with predictability when converting HNT to DC. +A new oracle price takes effect one hour in the future. The reason for this is to provide users with predictability when + converting HNT to DC: +* if one is trying to “sweep” all HNT from one wallet to another, one can leave just enough HNT to cover the transaction +fee via implicit burn +* if you are converting HNT into DC, you can know with relative certainty that your burn will yield a certain amount of +DCs - If one is trying to “sweep” all HNT from one wallet to another, one can leave just enough HNT to cover the transaction fee via implicit burn - If you are converting HNT into DC, you can know with relative certainty that your burn will yield a certain amount of DCs - - Unfortunately, this delay provides an on-chain arbitrage opportunity via state channels. Given the delay, an actor with HNT in-hand may see the forecasted drop in HNT price and thus convert HNT into DCs. After the drop takes effect, the actor may then “spend” the DCs in a state channel, naming a colluding gateway of theirs as the beneficiary. Effectively, the actor is burning and minting HNT on-chain with very little risk. + Unfortunately, this delay provides an on-chain arbitrage opportunity via state channels. Given the delay, an actor with + HNT in-hand may see the forecasted drop in HNT price and thus convert HNT into DCs. After the drop takes effect, the + actor may then “spend” the DCs in a state channel, naming a colluding gateway of theirs as the beneficiary. Effectively, + the actor is burning and minting HNT on-chain with very little risk. To demonstrate the “oracle arbitrage opportunity”, consider the following example: * At block 200, the current oracle price is $1.1 - * Submitted oracle prices will set the new oracle price to $1; this will take effect in one hour or roughly at block 260 - * Between block 200 and block 260, the actor may burn 1000 HNT, yielding $1100 worth of DC - * After block 260, the actor my close a state channel naming its colluding gateway as beneficiary of $1100 worth of DC, assuming: + * Submitted oracle prices will set the new oracle price to $1; this will take effect in one hour or roughly at block + 260 + * Between block 200 and block 260, the actor may burn 1,000 HNT, yielding $1100 worth of DC + * After block 260, the actor my close a state channel naming its colluding gateway as beneficiary of $1,100 worth of DC, + assuming: * the grace period on the state channel has expired * the oracle price has not changed again * the DC reward pool has not been maxed out - ⇒ the colluding gateway is awarded 1100 HNT + ⇒ the colluding gateway is awarded 1,100 HNT # Example @@ -32,84 +39,128 @@ A new oracle price takes effect one hour in the future. The reason for this is t The Dapper-Hickory-Meerkat, managed by [wallet 13ZiB74TJNdV5D5VFehEH3oMSuFNusjkho4gJYmnRmLRnXrZbE5](https://explorer.helium.com/accounts/13ZiB74TJNdV5D5VFehEH3oMSuFNusjkho4gJYmnRmLRnXrZbE5), has recently exploited this opportunity. -Here it is graphed from on-chain data showing HNT burn events, mining rewards from DC and what the oracle price was for all of these events: +Here it is graphed from on-chain data showing HNT burn events, mining rewards from DC and what the oracle price was for +all of these events: ![image MeerkatBurnAndMint](./0018-oracle-arb-fix/meerkat.png) -As you can see, “the big burn” of about 27k HNT was burned right before the oracle price dropped from about $1.2 to $1.1. Over time, the DC was “minted” back into HNT via the DC rewards. +As you can see, “the big burn” of about 27k HNT was burned right before the oracle price dropped from about $1.2 to $1.1. +Over time, the DC was “minted” back into HNT via the DC rewards. -It’s worth noting, despite the magnitude of burn and mint, at the time of this writing, only about 2k HNT was cleared by the owner of the Meerkat. Therefore, you could approximate: +It’s worth noting, despite the magnitude of burn and mint, at the time of this writing, only about 2k HNT was cleared by +the owner of the Meerkat. Therefore, you could approximate: * 27k HNT was burned * 29k HNT was minted -While only 2k HNT was cleared, another side-effect of the arbitrage is that the Proof-of-Coverage (POC) earnings during the period of the mint back were severely impacted as when the DC reward pool grows, it grows at the expense of POC rewards during that same epoch. +While only 2k HNT was cleared, another side-effect of the arbitrage is that the Proof-of-Coverage (POC) earnings during +the period of the mint back were severely impacted as when the DC reward pool grows, it grows at the expense of POC rewards during that same epoch. -It’s also worth noting that the mint back took roughly 24 hours, so should the market price and then the oracle price have snapped back, the Meerkat may have lost out. The severe price drop may also be an artifact due to manual entry of oracle prices. This will not be the focus of this HIP but remains noteworthy and perhaps the subject matter for future HIPs. +It’s also worth noting that the mint back took roughly 24 hours, so should the market price and then the oracle price +have snapped back, the Meerkat may have lost out. The severe price drop may also be an artifact due to manual entry of +oracle prices. This will not be the focus of this HIP but remains noteworthy and perhaps the subject matter for future +HIPs. # Winners and Losers as Is [winners-and-losers-as-is]: #winners-and-losers-as-is -So who gains what from this opportunity? As previously stated, the owner of the Meerkat’s wallet has cleared about 2k HNT. The rest of the HNT in play was essentially burned and redeemed; in effect, HNT emissions were cut by about 30% during the 24 hour period of mint back. In a direct sense, this benefits: +So who gains what from this opportunity? As previously stated, the owner of the Meerkat’s wallet has cleared about 2k +HNT. The rest of the HNT in play was essentially burned and redeemed; in effect, HNT emissions were cut by about 30% +during the 24 hour period of mint back. In a direct sense, this benefits: * Current holders of HNT: effectively, inflation has been curbed * non-POC earners: their emissions have not been affected # Solution [solution]: #solution -The opportunity for arbitrage is that the oracle price is forecasted to change before it actually changes. As previously mentioned, oracle reporting and oracle price adjustment may be compounding factors but are not the concern of the solution to be proposed herein. +The opportunity for arbitrage is that the oracle price is forecasted to change before it actually changes. As previously + mentioned, oracle reporting and oracle price adjustment may be compounding factors but are not the concern of the + solution to be proposed herein. -**The proposed solution is to make HNT to DC conversion for transaction fees to be based on the minimum of (previous prices and dynamic price) and to force burn transactions to accept a dynamic conversion rate, as long as it is below the transactions maximum acceptable conversion rate.** +**The proposed solution is to make HNT to DC conversion for transaction fees to be based on the minimum of (previous +prices and dynamic price) and to force burn transactions to accept a dynamic conversion rate, as long as it is below +the transactions maximum acceptable conversion rate.** -Since transaction fees are relatively insignificant in the economics of the Helium blockchain, allowing for “opportunistic” transactions should not affect things the way that burning HNT for DC does. Thus allowing a minimum of (previous prices and dynamic future prices) gives the same desired ease of use, with perhaps a surprise of paying less. +Since transaction fees are relatively insignificant in the economics of the Helium blockchain, allowing for +“opportunistic” transactions should not affect things the way that burning HNT for DC does. Thus allowing a minimum of +(previous prices and dynamic future prices) gives the same desired ease of use, with perhaps a surprise of paying less. -For HNT to DC conversion, the dynamic price essentially means that any oracle price changes may change one’s conversion rate. In general, the DC burn transaction is only useful for OUI operators or facilitators of these parties. As such, we may expect a level of sophistication from these actors relative to regular wallet holders or miners who simply wish to transact funds. +For HNT to DC conversion, the dynamic price essentially means that any oracle price changes may change one’s conversion +rate. In general, the DC burn transaction is only useful for OUI operators or facilitators of these parties. As such, +we may expect a level of sophistication from these actors relative to regular wallet holders or miners who simply wish +to transact funds. -However, to mitigate the impact of the dynamic price, we suggest the ability for dc_transactions_v2 to also stipulate a maximum oracle conversion rate. This will afford a level of assurance for these transactions with regards to oracle and market price volatility. +However, to mitigate the impact of the dynamic price, we suggest the ability for dc_transactions_v2 to also stipulate a + maximum oracle conversion rate. This will afford a level of assurance for these transactions with regards to oracle and + market price volatility. # Examples with Solution Implemented [examples-with-solution-implemented]: #examples-with-solution-implemented ## Failed Burn -* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1 and the *maximum conversion price set is $1*. +* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1 and the *maximum +conversion price set is $1*. * At block 201, a new oracle price of $1.1 is established and the Burn transaction is not in this block. -* At block 202, The token burn transaction is now invalid and will be dropped. It could theoretically be rebroadcast at a later time or the user could submit a new transaction with the same nonce to invalidate the transaction. +* At block 202, The token burn transaction is now invalid and will be dropped. It could theoretically be rebroadcast at +a later time or the user could submit a new transaction with the same nonce to invalidate the transaction. ## Successful Burn -* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1 and the *maximum conversion price set is $1.1*. -* At block 201, enough oracle reports set an instantly new oracle price of $1.1. The token burn transaction remains valid. +* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1 and the *maximum +conversion price set is $1.1*. +* At block 201, enough oracle reports set an instantly new oracle price of $1.1. The token burn transaction remains +valid. ## Payment Transaction * Fees are set to allow the best price in the previous 100 blocks -* A user submits a payment of 1 HNT to another address. Going back 100 blocks, the lowest oracle price is 50 blocks ago at $1 and current oracle price is $1.1. -* If the transaction is processed within 50 blocks, the $1 oracle price is honored and 0.35 HNT is withdrawn from the account to cover the $0.35 fee +* A user submits a payment of 1 HNT to another address. Going back 100 blocks, the lowest oracle price is 50 blocks ago +at $1 and current oracle price is $1.1. +* If the transaction is processed within 50 blocks, the $1 oracle price is honored and 0.35 HNT is withdrawn from the +account to cover the $0.35 fee ## Payment Transaction with Surprise Discount * Fees are set to allow the best price in the previous 100 blocks -* A user submits a payment of 1 HNT to another address. Going back 100 blocks, the lowest oracle price is 50 blocks ago at $1 +* A user submits a payment of 1 HNT to another address. Going back 100 blocks, the lowest oracle price is 50 blocks ago +at $1 * After submission but before the transaction is processed, a new price of $0.5 is issued * The $0.5 oracle price is honored and 0.175 HNT is withdrawn from the account to cover the $0.35 fee # Impact [impact]: #impact -So who gains what from this solution? While this solution is admittedly not the simplest from an implementation perspective, it attempts to resolve the logical existence of the arbitrage without affecting reward policy (no economic impact other than closing the arb) and without losing predictability in transaction fees. +So who gains what from this solution? While this solution is admittedly not the simplest from an implementation +perspective, it attempts to resolve the logical existence of the arbitrage without affecting reward policy (no economic +impact other than closing the arb) and without losing predictability in transaction fees. -In effect, it simply tries to take the “forward looking window” that oracle prices provide for transaction fees and instead provide a “backwards looking window”, along with the potential to pay less if by chance the oracle price goes down after submission. +In effect, it simply tries to take the “forward looking window” that oracle prices provide for transaction fees and +instead provide a “backwards looking window”, along with the potential to pay less if by chance the oracle price goes +down after submission. -One minor drawback here is that someone wishing to “sweep” the contents out of a wallet might get a better deal than anticipated and would leave some dust (a few bones) behind. This could be addressed in the future with a specific sweep transaction which would indicate “empty the wallet to this wallet”, thus leaving no dust behind. +One minor drawback here is that someone wishing to “sweep” the contents out of a wallet might get a better deal than +anticipated and would leave some dust (a few bones) behind. This could be addressed in the future with a specific sweep +transaction which would indicate “empty the wallet to this wallet”, thus leaving no dust behind. -The biggest downside of this solution is an increase in complexity for the burn transaction as the user does not know ahead of time what the cost will be; the maximum conversion rate is added to the transaction, however, which provides a bounded conversion rate. +The biggest downside of this solution is an increase in complexity for the burn transaction as the user does not know +ahead of time what the cost will be; the maximum conversion rate is added to the transaction, however, which provides a +bounded conversion rate. # Alternate Solutions [alternate-solutions]: #alternate-solutions ## Delayed HNT Burn -Delayed burn is not logically that different from the proposal here, except instead of releasing the DC immediately, the DC would be held until the future oracle price takes effect. The downside of this approach is DCs cannot be created without a delay and thus a user must wait for DCs when they may need them quickly. +Delayed burn is not logically that different from the proposal here, except instead of releasing the DC immediately, the + DC would be held until the future oracle price takes effect. The downside of this approach is DCs cannot be created + without a delay and thus a user must wait for DCs when they may need them quickly. ## 1.1:1 DC to HNT Conversion -Currently, DC rewards are determined by converting DC earned for a gateway into HNT at a 1:1 rate. Assuming the total HNT earned via DC rewards during the epoch is within the allocated percentage, the HNT rewarded is worth exactly the amount of DC earned by that gateway during the epoch. Recall that the 1:1 conversion was determined as a countermeasure to the DC spamming in August 2020, where traffic was low enough and so far below equilibrium, that every DC spent was effectively rewarding gateways 1:100 to 1:1000. - -While this solution would effectively negate the arbitrage opportunity, it has a secondary economic impact of decreasing the earning potential of gateways that forward network data, which is precisely the reason for the Helium Network to exist. In fact, before DC spamming made the flaw in incentives apparent, we very much wanted to reward a large slice to gateways that were forwarding data. +Currently, DC rewards are determined by converting DC earned for a gateway into HNT at a 1:1 rate. Assuming the total +HNT earned via DC rewards during the epoch is within the allocated percentage, the HNT rewarded is worth exactly the +amount of DC earned by that gateway during the epoch. Recall that the 1:1 conversion was determined as a countermeasure +to the DC spamming in August 2020, where traffic was low enough and so far below equilibrium, that every DC spent was + effectively rewarding gateways 1:100 to 1:1000. + +While this solution would effectively negate the arbitrage opportunity, it has a secondary economic impact of decreasing +the earning potential of gateways that forward network data, which is precisely the reason for the Helium Network to +exist. In fact, before DC spamming made the flaw in incentives apparent, we very much wanted to reward a large slice to +gateways that were forwarding data. From 8fe58a99a72c4c763319ff1752035571f12e5172 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Fri, 23 Oct 2020 08:26:52 -0700 Subject: [PATCH 16/30] fix logic around maximum vs minimum price for burn txn --- 0018-oracle-arb-fix.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index f65050996..0683b7244 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -89,27 +89,28 @@ rate. In general, the DC burn transaction is only useful for OUI operators or fa we may expect a level of sophistication from these actors relative to regular wallet holders or miners who simply wish to transact funds. -However, to mitigate the impact of the dynamic price, we suggest the ability for dc_transactions_v2 to also stipulate a - maximum oracle conversion rate. This will afford a level of assurance for these transactions with regards to oracle and - market price volatility. +However, to mitigate the impact of the dynamic price, we suggest the ability for blockchain_txn_token_burn_v2 to also +stipulate a minimum oracle conversion rate. This will afford minimum conversion rates for these transactions and protect +against oracle and market price volatility. # Examples with Solution Implemented [examples-with-solution-implemented]: #examples-with-solution-implemented ## Failed Burn -* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1 and the *maximum -conversion price set is $1*. -* At block 201, a new oracle price of $1.1 is established and the Burn transaction is not in this block. -* At block 202, The token burn transaction is now invalid and will be dropped. It could theoretically be rebroadcast at +* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1.1 and the *minimum +conversion price set is $1.1*. +* At block 201, a new oracle price of $1 is established (with no delay) and the burn transaction is not in this block. +* At block 202, the token burn transaction is now invalid and will be dropped. It could theoretically be rebroadcast at a later time or the user could submit a new transaction with the same nonce to invalidate the transaction. ## Successful Burn -* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1 and the *maximum -conversion price set is $1.1*. -* At block 201, enough oracle reports set an instantly new oracle price of $1.1. The token burn transaction remains -valid. +* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1.1 and the *minimum +conversion price set is $1*. +* At block 201, a new oracle price of $1 is established (with no delay) and the burn transaction is not in this block. +* At block 202, the token burn transaction remains valid and may be picked up as long as the accepted oracle price +remains above $1. ## Payment Transaction From d5dfa0d44457a4680d11f6ff3f2408d72ab22bf6 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Fri, 23 Oct 2020 08:34:48 -0700 Subject: [PATCH 17/30] include reduced oracle price delay as alternate solution --- 0018-oracle-arb-fix.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 0683b7244..78e4c5839 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -150,10 +150,19 @@ bounded conversion rate. # Alternate Solutions [alternate-solutions]: #alternate-solutions +## Reduced Delay on new Oracle Prices +The Oracle delay could be reduce from 60 minutes to, perhaps 15 minutes. The effect would be that the arbitrageur would +have ~15 blocks to burn DCs at and advantageous price instead of ~60 blocks. This would not logically close the arb and +thus leaves a guaranteed on-chain profit for the arbitrageur; keep in mind, off-chain market data may be used to front-run +prices as well. In addition, as we reduce the delay, we introduce a higher probability that "something surprising" +happens to other actors, notably anyone using implicit burn. Regular users would have to time their transactions +carefully to avoid being at the cusp of a price change. + ## Delayed HNT Burn Delayed burn is not logically that different from the proposal here, except instead of releasing the DC immediately, the DC would be held until the future oracle price takes effect. The downside of this approach is DCs cannot be created without a delay and thus a user must wait for DCs when they may need them quickly. + ## 1.1:1 DC to HNT Conversion Currently, DC rewards are determined by converting DC earned for a gateway into HNT at a 1:1 rate. Assuming the total HNT earned via DC rewards during the epoch is within the allocated percentage, the HNT rewarded is worth exactly the From a9cb848f5ee21603b75dffc8216393b91d3f23b9 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Mon, 26 Oct 2020 09:03:47 -0700 Subject: [PATCH 18/30] reduce complexity --- 0018-oracle-arb-fix.md | 123 +++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 71 deletions(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 78e4c5839..bd0aa5ddb 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -15,12 +15,12 @@ fee via implicit burn * if you are converting HNT into DC, you can know with relative certainty that your burn will yield a certain amount of DCs - Unfortunately, this delay provides an on-chain arbitrage opportunity via state channels. Given the delay, an actor with +Unfortunately, this delay provides an on-chain arbitrage opportunity via state channels. Given the delay, an actor with HNT in-hand may see the forecasted drop in HNT price and thus convert HNT into DCs. After the drop takes effect, the actor may then “spend” the DCs in a state channel, naming a colluding gateway of theirs as the beneficiary. Effectively, the actor is burning and minting HNT on-chain with very little risk. - To demonstrate the “oracle arbitrage opportunity”, consider the following example: +To demonstrate the “oracle arbitrage opportunity”, consider the following example: * At block 200, the current oracle price is $1.1 * Submitted oracle prices will set the new oracle price to $1; this will take effect in one hour or roughly at block 260 @@ -40,58 +40,60 @@ DCs The Dapper-Hickory-Meerkat, managed by [wallet 13ZiB74TJNdV5D5VFehEH3oMSuFNusjkho4gJYmnRmLRnXrZbE5](https://explorer.helium.com/accounts/13ZiB74TJNdV5D5VFehEH3oMSuFNusjkho4gJYmnRmLRnXrZbE5), has recently exploited this opportunity. Here it is graphed from on-chain data showing HNT burn events, mining rewards from DC and what the oracle price was for -all of these events: + all of these events: ![image MeerkatBurnAndMint](./0018-oracle-arb-fix/meerkat.png) As you can see, “the big burn” of about 27k HNT was burned right before the oracle price dropped from about $1.2 to $1.1. -Over time, the DC was “minted” back into HNT via the DC rewards. + Over time, the DC was “minted” back into HNT via the DC rewards. -It’s worth noting, despite the magnitude of burn and mint, at the time of this writing, only about 2k HNT was cleared by -the owner of the Meerkat. Therefore, you could approximate: + It’s worth noting, despite the magnitude of burn and mint, at the time of this writing, only about 2k HNT was cleared by + the owner of the Meerkat. Therefore, you could approximate: * 27k HNT was burned * 29k HNT was minted -While only 2k HNT was cleared, another side-effect of the arbitrage is that the Proof-of-Coverage (POC) earnings during -the period of the mint back were severely impacted as when the DC reward pool grows, it grows at the expense of POC rewards during that same epoch. + While only 2k HNT was cleared, another side-effect of the arbitrage is that the Proof-of-Coverage (POC) earnings during + the period of the mint back were severely impacted as when the DC reward pool grows, it grows at the expense of POC + rewards during that same epoch. -It’s also worth noting that the mint back took roughly 24 hours, so should the market price and then the oracle price -have snapped back, the Meerkat may have lost out. The severe price drop may also be an artifact due to manual entry of -oracle prices. This will not be the focus of this HIP but remains noteworthy and perhaps the subject matter for future -HIPs. + It’s also worth noting that the mint back took roughly 24 hours, so should the market price and then the oracle price + have snapped back, the Meerkat may have lost out. The severe price drop may also be an artifact due to manual entry of + oracle prices. This will not be the focus of this HIP but remains noteworthy and perhaps the subject matter for future + HIPs. # Winners and Losers as Is [winners-and-losers-as-is]: #winners-and-losers-as-is So who gains what from this opportunity? As previously stated, the owner of the Meerkat’s wallet has cleared about 2k -HNT. The rest of the HNT in play was essentially burned and redeemed; in effect, HNT emissions were cut by about 30% -during the 24 hour period of mint back. In a direct sense, this benefits: + HNT. The rest of the HNT in play was essentially burned and redeemed; in effect, HNT emissions were cut by about 30% + during the 24 hour period of mint back. In a direct sense, this benefits: * Current holders of HNT: effectively, inflation has been curbed * non-POC earners: their emissions have not been affected # Solution [solution]: #solution -The opportunity for arbitrage is that the oracle price is forecasted to change before it actually changes. As previously - mentioned, oracle reporting and oracle price adjustment may be compounding factors but are not the concern of the - solution to be proposed herein. -**The proposed solution is to make HNT to DC conversion for transaction fees to be based on the minimum of (previous -prices and dynamic price) and to force burn transactions to accept a dynamic conversion rate, as long as it is below -the transactions maximum acceptable conversion rate.** +The opportunity for arbitrage is that the oracle price is forecasted to change before it actually changes. The only + transaction, however, that creates DC in a way that can become HNT again is `blockchain_txn_token_burn_v1`. All other + transactions that benefit from "implicit burn" do not create DCs that can be spent in a state channel and thus a + circular arbitrage route (HNT->DC->HNT) is not available. -Since transaction fees are relatively insignificant in the economics of the Helium blockchain, allowing for -“opportunistic” transactions should not affect things the way that burning HNT for DC does. Thus allowing a minimum of -(previous prices and dynamic future prices) gives the same desired ease of use, with perhaps a surprise of paying less. +Therefore, **the proposed solution is to force burn transactions to accept a dynamic oracle price, but allow the + transaction to optionally specify a minimum acceptable conversion rate.** -For HNT to DC conversion, the dynamic price essentially means that any oracle price changes may change one’s conversion -rate. In general, the DC burn transaction is only useful for OUI operators or facilitators of these parties. As such, -we may expect a level of sophistication from these actors relative to regular wallet holders or miners who simply wish -to transact funds. +Since all other fees do not have potential for circular arbitrage schemes, they remain unaffected. -However, to mitigate the impact of the dynamic price, we suggest the ability for blockchain_txn_token_burn_v2 to also -stipulate a minimum oracle conversion rate. This will afford minimum conversion rates for these transactions and protect -against oracle and market price volatility. +In general, the DC burn transaction is only useful for OUI operators or facilitators of these parties. As such, we may + expect a level of sophistication from these actors relative to regular wallet holders or miners who simply wish to + transact funds. + +However, to mitigate the impact of the dynamic price, we stipulate the ability for to optionally indicate a minimum + oracle conversion rate. This would protect against oracle and market price volatility. + +As previously mentioned, oracle reporting and oracle price adjustment may be compounding factors but are not the concern + of the solution to be proposed herein. That being said, [a PR against helium-wallet](https://github.com/helium/helium-wallet-rs/pull/58) + exists which attempts to address those shortcomings. # Examples with Solution Implemented [examples-with-solution-implemented]: #examples-with-solution-implemented @@ -99,7 +101,7 @@ against oracle and market price volatility. ## Failed Burn * A user submits a token burn right after block 200 is forged. Oracle price at that time is $1.1 and the *minimum -conversion price set is $1.1*. + conversion price set is $1.1*. * At block 201, a new oracle price of $1 is established (with no delay) and the burn transaction is not in this block. * At block 202, the token burn transaction is now invalid and will be dropped. It could theoretically be rebroadcast at a later time or the user could submit a new transaction with the same nonce to invalidate the transaction. @@ -107,56 +109,35 @@ a later time or the user could submit a new transaction with the same nonce to i ## Successful Burn * A user submits a token burn right after block 200 is forged. Oracle price at that time is $1.1 and the *minimum -conversion price set is $1*. + conversion price set is $1*. * At block 201, a new oracle price of $1 is established (with no delay) and the burn transaction is not in this block. * At block 202, the token burn transaction remains valid and may be picked up as long as the accepted oracle price remains above $1. -## Payment Transaction - -* Fees are set to allow the best price in the previous 100 blocks -* A user submits a payment of 1 HNT to another address. Going back 100 blocks, the lowest oracle price is 50 blocks ago -at $1 and current oracle price is $1.1. -* If the transaction is processed within 50 blocks, the $1 oracle price is honored and 0.35 HNT is withdrawn from the -account to cover the $0.35 fee - -## Payment Transaction with Surprise Discount - -* Fees are set to allow the best price in the previous 100 blocks -* A user submits a payment of 1 HNT to another address. Going back 100 blocks, the lowest oracle price is 50 blocks ago -at $1 -* After submission but before the transaction is processed, a new price of $0.5 is issued -* The $0.5 oracle price is honored and 0.175 HNT is withdrawn from the account to cover the $0.35 fee - # Impact [impact]: #impact -So who gains what from this solution? While this solution is admittedly not the simplest from an implementation -perspective, it attempts to resolve the logical existence of the arbitrage without affecting reward policy (no economic -impact other than closing the arb) and without losing predictability in transaction fees. - -In effect, it simply tries to take the “forward looking window” that oracle prices provide for transaction fees and -instead provide a “backwards looking window”, along with the potential to pay less if by chance the oracle price goes -down after submission. +So who gains what from this solution? Nobody in particular gains other than the exact opposite of those who gained from + the arbitrage existing (see Winners and Losers above). The merits of this solution are that in targets the arbitrage + precisely without further economic impact. -One minor drawback here is that someone wishing to “sweep” the contents out of a wallet might get a better deal than -anticipated and would leave some dust (a few bones) behind. This could be addressed in the future with a specific sweep -transaction which would indicate “empty the wallet to this wallet”, thus leaving no dust behind. +In effect, this proposal only affords the "forward looking window" for transactions that cannot accomplish the circular + arbitrage route that the DC burn transaction can. The biggest downside of this solution is an increase in complexity for the burn transaction as the user does not know -ahead of time what the cost will be; the maximum conversion rate is added to the transaction, however, which provides a -bounded conversion rate. + ahead of time what the cost will be; the minimum conversion rate is added to the transaction, however, which provides a + bounded conversion rate. # Alternate Solutions [alternate-solutions]: #alternate-solutions ## Reduced Delay on new Oracle Prices The Oracle delay could be reduce from 60 minutes to, perhaps 15 minutes. The effect would be that the arbitrageur would -have ~15 blocks to burn DCs at and advantageous price instead of ~60 blocks. This would not logically close the arb and -thus leaves a guaranteed on-chain profit for the arbitrageur; keep in mind, off-chain market data may be used to front-run -prices as well. In addition, as we reduce the delay, we introduce a higher probability that "something surprising" -happens to other actors, notably anyone using implicit burn. Regular users would have to time their transactions -carefully to avoid being at the cusp of a price change. + have ~15 blocks to burn DCs at and advantageous price instead of ~60 blocks. This would not logically close the arb and + thus leaves a guaranteed on-chain profit for the arbitrageur; keep in mind, off-chain market data may be used to front- + run prices as well. In addition, as we reduce the delay, we introduce a higher probability that "something surprising" + happens to other actors, notably anyone using implicit burn. Regular users would have to time their transactions + carefully to avoid being at the cusp of a price change. ## Delayed HNT Burn Delayed burn is not logically that different from the proposal here, except instead of releasing the DC immediately, the @@ -165,12 +146,12 @@ Delayed burn is not logically that different from the proposal here, except inst ## 1.1:1 DC to HNT Conversion Currently, DC rewards are determined by converting DC earned for a gateway into HNT at a 1:1 rate. Assuming the total -HNT earned via DC rewards during the epoch is within the allocated percentage, the HNT rewarded is worth exactly the -amount of DC earned by that gateway during the epoch. Recall that the 1:1 conversion was determined as a countermeasure -to the DC spamming in August 2020, where traffic was low enough and so far below equilibrium, that every DC spent was + HNT earned via DC rewards during the epoch is within the allocated percentage, the HNT rewarded is worth exactly the + amount of DC earned by that gateway during the epoch. Recall that the 1:1 conversion was determined as a countermeasure + to the DC spamming in August 2020, where traffic was low enough and so far below equilibrium, that every DC spent was effectively rewarding gateways 1:100 to 1:1000. While this solution would effectively negate the arbitrage opportunity, it has a secondary economic impact of decreasing -the earning potential of gateways that forward network data, which is precisely the reason for the Helium Network to -exist. In fact, before DC spamming made the flaw in incentives apparent, we very much wanted to reward a large slice to -gateways that were forwarding data. + the earning potential of gateways that forward network data, which is precisely the reason for the Helium Network to + exist. In fact, before DC spamming made the flaw in incentives apparent, we very much wanted to reward a large slice to + gateways that were forwarding data. From 35a60a5196affdce6f084ca4f17a17019c5e8c94 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:02:59 -0700 Subject: [PATCH 19/30] fmting fixes --- 0018-oracle-arb-fix.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index bd0aa5ddb..c1bd842a9 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -21,12 +21,12 @@ Unfortunately, this delay provides an on-chain arbitrage opportunity via state c the actor is burning and minting HNT on-chain with very little risk. To demonstrate the “oracle arbitrage opportunity”, consider the following example: - * At block 200, the current oracle price is $1.1 - * Submitted oracle prices will set the new oracle price to $1; this will take effect in one hour or roughly at block + * At block 200, the current oracle price is $1.10 + * Submitted oracle prices will set the new oracle price to $1.00; this will take effect in one hour or roughly at block 260 - * Between block 200 and block 260, the actor may burn 1,000 HNT, yielding $1100 worth of DC - * After block 260, the actor my close a state channel naming its colluding gateway as beneficiary of $1,100 worth of DC, - assuming: + * Between block 200 and block 260, the actor may burn 1,000 HNT, yielding $1,100.00 worth of DC + * After block 260, the actor my close a state channel naming its colluding gateway as beneficiary of $1,100.00 worth of + DC, assuming: * the grace period on the state channel has expired * the oracle price has not changed again * the DC reward pool has not been maxed out @@ -45,19 +45,19 @@ Here it is graphed from on-chain data showing HNT burn events, mining rewards fr ![image MeerkatBurnAndMint](./0018-oracle-arb-fix/meerkat.png) -As you can see, “the big burn” of about 27k HNT was burned right before the oracle price dropped from about $1.2 to $1.1. - Over time, the DC was “minted” back into HNT via the DC rewards. +As you can see, “the big burn” of about 27k HNT was burned right before the oracle price dropped from about $1.20 to +$1.10. Over time, the DC was “minted” back into HNT via the DC rewards. - It’s worth noting, despite the magnitude of burn and mint, at the time of this writing, only about 2k HNT was cleared by - the owner of the Meerkat. Therefore, you could approximate: +It’s worth noting, despite the magnitude of burn and mint, at the time of this writing, only about 2k HNT was cleared + by the owner of the Meerkat. Therefore, you could approximate: * 27k HNT was burned * 29k HNT was minted - While only 2k HNT was cleared, another side-effect of the arbitrage is that the Proof-of-Coverage (POC) earnings during +While only 2k HNT was cleared, another side-effect of the arbitrage is that the Proof-of-Coverage (POC) earnings during the period of the mint back were severely impacted as when the DC reward pool grows, it grows at the expense of POC rewards during that same epoch. - It’s also worth noting that the mint back took roughly 24 hours, so should the market price and then the oracle price +It’s also worth noting that the mint back took roughly 24 hours, so should the market price and then the oracle price have snapped back, the Meerkat may have lost out. The severe price drop may also be an artifact due to manual entry of oracle prices. This will not be the focus of this HIP but remains noteworthy and perhaps the subject matter for future HIPs. @@ -100,19 +100,19 @@ As previously mentioned, oracle reporting and oracle price adjustment may be com ## Failed Burn -* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1.1 and the *minimum - conversion price set is $1.1*. -* At block 201, a new oracle price of $1 is established (with no delay) and the burn transaction is not in this block. +* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1.10 and the *minimum + conversion price set is $1.10*. +* At block 201, a new oracle price of $1.00 is established (with no delay) and the burn transaction is not in this block. * At block 202, the token burn transaction is now invalid and will be dropped. It could theoretically be rebroadcast at a later time or the user could submit a new transaction with the same nonce to invalidate the transaction. ## Successful Burn -* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1.1 and the *minimum - conversion price set is $1*. -* At block 201, a new oracle price of $1 is established (with no delay) and the burn transaction is not in this block. +* A user submits a token burn right after block 200 is forged. Oracle price at that time is $1.10 and the *minimum + conversion price set is $1.00*. +* At block 201, a new oracle price of $1.00 is established (with no delay) and the burn transaction is not in this block. * At block 202, the token burn transaction remains valid and may be picked up as long as the accepted oracle price -remains above $1. +remains above $1.00. # Impact [impact]: #impact From 696c29c3b9f3e30f772a682cc61def3118ff3271 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:16:45 -0700 Subject: [PATCH 20/30] Update 0018-oracle-arb-fix.md --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index c1bd842a9..11c5b7467 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -18,7 +18,7 @@ DCs Unfortunately, this delay provides an on-chain arbitrage opportunity via state channels. Given the delay, an actor with HNT in-hand may see the forecasted drop in HNT price and thus convert HNT into DCs. After the drop takes effect, the actor may then “spend” the DCs in a state channel, naming a colluding gateway of theirs as the beneficiary. Effectively, - the actor is burning and minting HNT on-chain with very little risk. + the actor is burning and minting HNT on-chain at a profit with very little risk. To demonstrate the “oracle arbitrage opportunity”, consider the following example: * At block 200, the current oracle price is $1.10 From af8bc7d708326400e9d15e49c4453f28fb249e8b Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:17:37 -0700 Subject: [PATCH 21/30] Update 0018-oracle-arb-fix.md --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 11c5b7467..4d9cfc5f7 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -31,7 +31,7 @@ To demonstrate the “oracle arbitrage opportunity”, consider the following ex * the oracle price has not changed again * the DC reward pool has not been maxed out - ⇒ the colluding gateway is awarded 1,100 HNT + ⇒ the colluding gateway is awarded 1,100 HNT at the next epoch payout # Example From b8606729d55934dd3a05358e2660bbda18997f4c Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:18:05 -0700 Subject: [PATCH 22/30] Update 0018-oracle-arb-fix.md --- 0018-oracle-arb-fix.md | 1 - 1 file changed, 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 4d9cfc5f7..43e0f6b81 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -28,7 +28,6 @@ To demonstrate the “oracle arbitrage opportunity”, consider the following ex * After block 260, the actor my close a state channel naming its colluding gateway as beneficiary of $1,100.00 worth of DC, assuming: * the grace period on the state channel has expired - * the oracle price has not changed again * the DC reward pool has not been maxed out ⇒ the colluding gateway is awarded 1,100 HNT at the next epoch payout From 215a932d672048a77a6f066b97036bb18cd96d52 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:19:54 -0700 Subject: [PATCH 23/30] Update 0018-oracle-arb-fix.md --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 43e0f6b81..149a21719 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -74,7 +74,7 @@ So who gains what from this opportunity? As previously stated, the owner of the [solution]: #solution The opportunity for arbitrage is that the oracle price is forecasted to change before it actually changes. The only - transaction, however, that creates DC in a way that can become HNT again is `blockchain_txn_token_burn_v1`. All other + transaction that creates DC in a way that can become HNT again, however, is `blockchain_txn_token_burn_v1`. All other transactions that benefit from "implicit burn" do not create DCs that can be spent in a state channel and thus a circular arbitrage route (HNT->DC->HNT) is not available. From c5c04f694a661792b989cb3b311c065be5d26280 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:21:10 -0700 Subject: [PATCH 24/30] Update 0018-oracle-arb-fix.md --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 149a21719..444ccb7a5 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -87,7 +87,7 @@ In general, the DC burn transaction is only useful for OUI operators or facilita expect a level of sophistication from these actors relative to regular wallet holders or miners who simply wish to transact funds. -However, to mitigate the impact of the dynamic price, we stipulate the ability for to optionally indicate a minimum +However, to mitigate the impact of the dynamic price, we stipulate the ability to optionally indicate a minimum oracle conversion rate. This would protect against oracle and market price volatility. As previously mentioned, oracle reporting and oracle price adjustment may be compounding factors but are not the concern From 00c2c9020ea1fe68cc8aa5eda00b8696a7dbd4ae Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:28:36 -0700 Subject: [PATCH 25/30] add to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 90cf59c82..c9df6fd78 100644 --- a/README.md +++ b/README.md @@ -29,3 +29,4 @@ If you have questions or feedback, please ask in [#hips in the community Discord | 15 | [Beaconing Rewards](https://github.com/helium/HIP/blob/master/0015-beaconing-rewards.md) | [In Discussion](https://github.com/helium/HIP/issues/51) | | 16 | [Random Consensus Group Elections](https://github.com/helium/HIP/blob/master/0016-random-consensus-group-election.md) | [In Discussion](https://github.com/helium/HIP/issues/55) | | 17 | [Hex Density-based Transmit Reward Scaling](https://github.com/helium/HIP/blob/master/0017-hex-density-based-transmit-reward-scaling.md) | [In Discussion](https://github.com/helium/HIP/issues/60) | +| 17 | [Hex Density-based Transmit Reward Scaling](https://github.com/helium/HIP/blob/master/0018-oracle-arb-fix.md) | [In Discussion](https://github.com/helium/HIP/issues/60) | From 2e5bd17096141ac9fe88823a0c267a2564046006 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:30:03 -0700 Subject: [PATCH 26/30] improve title --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c9df6fd78..b34841698 100644 --- a/README.md +++ b/README.md @@ -29,4 +29,4 @@ If you have questions or feedback, please ask in [#hips in the community Discord | 15 | [Beaconing Rewards](https://github.com/helium/HIP/blob/master/0015-beaconing-rewards.md) | [In Discussion](https://github.com/helium/HIP/issues/51) | | 16 | [Random Consensus Group Elections](https://github.com/helium/HIP/blob/master/0016-random-consensus-group-election.md) | [In Discussion](https://github.com/helium/HIP/issues/55) | | 17 | [Hex Density-based Transmit Reward Scaling](https://github.com/helium/HIP/blob/master/0017-hex-density-based-transmit-reward-scaling.md) | [In Discussion](https://github.com/helium/HIP/issues/60) | -| 17 | [Hex Density-based Transmit Reward Scaling](https://github.com/helium/HIP/blob/master/0018-oracle-arb-fix.md) | [In Discussion](https://github.com/helium/HIP/issues/60) | +| 17 | [Remove Oracle Forecast for DC Burn](https://github.com/helium/HIP/blob/master/0018-oracle-arb-fix.md) | [In Discussion](https://github.com/helium/HIP/issues/60) | From 1c3b52e320d4fc9171e0bcecb070599f43a059f4 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:31:08 -0700 Subject: [PATCH 27/30] new title --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index 444ccb7a5..edd079df7 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -1,4 +1,4 @@ -# HIP18: Oracle Arbitrage Fix +# HIP18: Remove Oracle Forecast for DC Burn - Author: [@lthiery](https://github.com/lthiery) - Start Date: 2020-10-22 From 707ee2ceec3b83620b03f361530c3c61439459c7 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:33:18 -0700 Subject: [PATCH 28/30] complete renaming --- .../meerkat.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename {0018-oracle-arb-fix => 0018-remove-oracle-forecast-for-dc-burn}/meerkat.png (100%) diff --git a/0018-oracle-arb-fix/meerkat.png b/0018-remove-oracle-forecast-for-dc-burn/meerkat.png similarity index 100% rename from 0018-oracle-arb-fix/meerkat.png rename to 0018-remove-oracle-forecast-for-dc-burn/meerkat.png From b723ad719e74ac9db26400861605bb7c3c64a499 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:34:19 -0700 Subject: [PATCH 29/30] fix img --- 0018-oracle-arb-fix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/0018-oracle-arb-fix.md b/0018-oracle-arb-fix.md index edd079df7..9cbb36121 100644 --- a/0018-oracle-arb-fix.md +++ b/0018-oracle-arb-fix.md @@ -41,7 +41,7 @@ The Dapper-Hickory-Meerkat, managed by [wallet 13ZiB74TJNdV5D5VFehEH3oMSuFNusjkh Here it is graphed from on-chain data showing HNT burn events, mining rewards from DC and what the oracle price was for all of these events: -![image MeerkatBurnAndMint](./0018-oracle-arb-fix/meerkat.png) +![image MeerkatBurnAndMint](./0018-remove-oracle-forecast-for-dc-burn/meerkat.png) As you can see, “the big burn” of about 27k HNT was burned right before the oracle price dropped from about $1.20 to From ceda616e6486634c10e5f55701536cc349aac0f6 Mon Sep 17 00:00:00 2001 From: Louis Thiery Date: Wed, 28 Oct 2020 16:35:27 -0700 Subject: [PATCH 30/30] fix link in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b34841698..01079fe66 100644 --- a/README.md +++ b/README.md @@ -29,4 +29,4 @@ If you have questions or feedback, please ask in [#hips in the community Discord | 15 | [Beaconing Rewards](https://github.com/helium/HIP/blob/master/0015-beaconing-rewards.md) | [In Discussion](https://github.com/helium/HIP/issues/51) | | 16 | [Random Consensus Group Elections](https://github.com/helium/HIP/blob/master/0016-random-consensus-group-election.md) | [In Discussion](https://github.com/helium/HIP/issues/55) | | 17 | [Hex Density-based Transmit Reward Scaling](https://github.com/helium/HIP/blob/master/0017-hex-density-based-transmit-reward-scaling.md) | [In Discussion](https://github.com/helium/HIP/issues/60) | -| 17 | [Remove Oracle Forecast for DC Burn](https://github.com/helium/HIP/blob/master/0018-oracle-arb-fix.md) | [In Discussion](https://github.com/helium/HIP/issues/60) | +| 17 | [Remove Oracle Forecast for DC Burn](https://github.com/helium/HIP/blob/master/0018-remove-oracle-forecast-for-dc-burn.md) | [In Discussion](https://github.com/helium/HIP/issues/60) |