MinnowBooster has been around for sometime now and more recently we have seen it replaced with Dlease.io. The idea is that STEEMPower holders can delegate out their STEEMPower and earn a passive income, hopefully attracting new investors to hold Steem Power.
Dlease.io currently shows an Average Net APR: 16.30 % on their website, which is a nice passive income and with no risk to bad debts. For those involved in cryptocurrencies this could be viewed as a far less risky growth strategy over trading.
This analysis was suggested to me, as an independent review by @thecryptodrive, one of the MinnoBooster founders.
When I started looking at the MinnowBooster leasing data on the blockchain, it became very obvious that tracing things from the blockchain data alone would be extremely difficult. It would involve splitting text memos and a serious amount of back tracking and time. So, a different approach was necessary to carry out an analysis other than starting with the blockchain data.
MinnowBooster supplied me with 3 CSV files of data for the period 1st Dec to 28th Feb
1. Expire lease
2. Live leases at end of period
3. Unfilled leases
The expired lease file was combined with the live lease at end of period to get a table of all active leases within the period. These files were used for the basis of the Analysis and then an audit was carried out against the blockchain records.
The Analysis
This analysis was carried out on data from 1st Dec 18 to 28th Feb 19. It is worth pointing out during this time period, STEEM was seeing a two year low price and the market was very quiet. This would have a direct impact on both the number of leases and the APR as there was such a squeeze of the market.
Lease Activity
At the start of the 3-month period there were 1809 leases in operation, these leases had a value of 1,654,869 SP. During the 3 months 1913 new leases with a value of 1,590,975 SP were created and 2158 leases with a value of 1,775,558 expired. On 28th Feb 1564 leases were in operation with a to a value of 1,470,286 SP.
Zooming in on the chart above, on the left we have count details of the number of leases per month. We can see Jan created the highest new leases in a month with 666. We can also see that for Jan, 809 leases expired giving a net movement of -143 leases in operation for the month.
On the right we can see the value of these new and expired leases in Steem Power. Although Jan had the highest number of new leases, it has the lowest new lease value of 0.52M, where as the expired lease for Jan was 0.60M SP.
The highest delegation given in Dec was 14,008SP and the lowest was 15. The average delegation amount for December was 852 SP and the median 283 SP.
In Dec there were 149 leasers and 177 leasees, this increases to 167 and 201 respectively by in Jan
A quick analysis of the duration of leases show the median term being 12 weeks, the average being 14.47. The shortest is 1 week or less and the longest lease term was 90 weeks.
APR
Leases that started prior to the reporting period were showing an average APR of 13.7%, with those created in 2018 of a slightly higher APR than those in 2017. The new leases set up during the reporting period show an average APR of 14.55%. The average APR of all active leases during the period was 14.14%
Note: See audit notes and audit qualification for details of current APR.
The Max ARP made on a lease was over 65%. We can see this along with the median, average and min APRs made for each month on the chart above.
Further analysis shows the high APR leases are of very low value (0.2% of lease value) and most leases (57.9%) have an APR of between 10%-12%. This is laid out in the histogram below
Unfilled Leases
In total for the 3 months there were 1899 unfilled orders. That equates to almost 50% of the number of leases requested, however it only equates to 4.78% of the value of the total lease requests.
The high % of unfilled orders was impacted greatly by 1 account. This account place almost 700 low value (less than 2sp) lease requests in a very short period. Dec and Feb both show an average of between 37% and 39% unfilled lease requests.
Audit Work
The scope of this audit was to ensure transactions as shown in the data supplied by @MinnowBooster were verifiable on the STEEM blockchain and they show a true and fair reflection of the leasing operations. Audit tests were designed to test the reliability and the completeness of the data provided. Audit tests were also carried out to test the accuracy of the currently displayed average APR on Dlease.io
Transaction period 1st Dec 18 to 28th Feb 19
Audit Qualification
Based on the data provided by MinnowBooster, when examined shows a true and fair reflection of the leasing operations carried out by Minnow Booster for the time period audited.
Base on Sample data taken during the audit it has been determined that the average APR as shown on Dlease.io as of 28 March 2019 of 16.33% is also true and fair.
Audit Tests and working paper notes
Audit test 1 & 2 - Can delegations be traced from MinnowBooster records to the blockchain?
Using the query below to access the blockchain, a record of delegations was extracted to Excel for the above time period.
An additional column (audit test 1) was created to create a lookup column, the formula used was
=delegations_made[@delegator]&delegations_made[@delegatee]&delegations_made[@timestamp]
A lookup column was also created in the leases table using the formula
=MinnowBooster_theleases[@[name_1]]&MinnowBooster_theleases[@name]&MinnowBooster_theleases[@[created_at]]
These new columns were then used to extract the blockchain transaction number to the leases table.
=IFNA(VLOOKUP(B2,blockchain!B:H,3,FALSE),"")
From 1913 new leases during the period, this test verified 1882 – leaving unverified of 31
Plausible cause for the discrepancy: On creating the MinnowBooster table, some dates were calculated manually and not included in the raw data. These date calculations were based on weeks duration shown in the MinnowBooster data, however only whole weeks were shown when in fact, some of these may have been part weeks. Therefore, the lookup columns may not match.
To overcome this a second lookup column (audit 2) was created in the leases data using the formula
=MinnowBooster_theleases[@[name_1]]&MinnowBooster_theleases[@name]&ROUND(I2,0)
And in the blockchain data a lookup column was created using
=delegations_made[@delegator]&delegations_made[@delegatee]&ROUND(delegations_made[@[vesting_shares]],0)
These new columns were then used to extract the blockchain transaction number to the leases table using
=IF([@[delegation block ref_1]]="",VLOOKUP(A2,blockchain!$A:$D,4,FALSE),[@[delegation block ref_1]])
This test verifies 28 of the 31 remaining transactions.
These test results satisfy that delegations recorded by MinnowBooster can be traced to the blockchain.
The M code used to extract and transform the data from the blockchain and load to excel was
let
Source = Sql.Database("vip.steemsql.com", "DBsteem", [Query="select *#(lf)from TxdelegateVestingShares#(lf)where timestamp >= CONVERT(datetime,'12/01/2018')"]),
#"Filtered Rows1" = Table.SelectRows(Source, each ([delegator] <> "steem")),
#"Filtered Rows" = Table.SelectRows(#"Filtered Rows1", each ([delegator] <> "steem") and ([vesting_shares] <> 0)),
#"Changed Type" = Table.TransformColumnTypes(#"Filtered Rows",{{"timestamp", type date}})
in
#"Changed Type"
Audit test 3 – Can blockchain delegations be verified on MinnowBooster as proof of completion of records?
Using the query below we extracted transfers made by MinnowBooster from the blockchain. This table was further filtered to return where the memos include the text ‘Your delegation with the id’. A new column was added – audit test 3 to create a lookup reference. The formula used was =[@to]&[@[lease to]]&[@timestamp]
A quick count shows 2261 records. This gives a difference of 348 on the number of new leases set up in the period not shown in MinnowBoosters records. This suggesting record supplied to me were not complete.
Using this new lookup column, we now looked up the value in the leases table (audt2_result) which resulted in 376 non match transactions. These transactions were supplied to MinnowBooster. After looking further at the database, it appeared that the files sent to me did not include transactions which started in the period of the data, but ended after it, but ended before we ran the analysis. A new file was supplied which included these missing transactions.
let
Source = Sql.Database("vip.steemsql.com", "DBsteem", [Query="select *#(lf)from txtransfers#(lf)where [from] in ('MinnowBooster')"]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"timestamp", type date}}),
#"Filtered Rows1" = Table.SelectRows(#"Changed Type", each [timestamp] > #date(2018, 11, 30)),
#"Filtered Rows" = Table.SelectRows(#"Filtered Rows1", each Text.Contains([memo], "started")),
#"Inserted Text Between Delimiters" = Table.AddColumn(#"Filtered Rows", "Text Between Delimiters", each Text.BetweenDelimiters([memo], "to ", " "), type text),
#"Renamed Columns" = Table.RenameColumns(#"Inserted Text Between Delimiters",{{"Text Between Delimiters", "lease to"}}),
#"Replaced Value" = Table.ReplaceValue(#"Renamed Columns","@","",Replacer.ReplaceText,{"lease to"})
in
#"Replaced Value"
Audit test 4 – Verification of interest repayments and APR
In order to confirm lease interest payments were made, the query below was used to extract transfers made by MinnowBooster from the blockchain. A new column was added as a lookup. In the leases table the lookup column from audit test1 was used to extract the total repayment as per the memo. This was compared to the recorded value as shown in the charts above.
A 10% Difference was found. MinnowBooster charge is 10% and can account for the difference.
The above APR reported can be adjusted to the below to reflect these charges.
let
Source = Sql.Database("vip.steemsql.com", "DBsteem", [Query="select *#(lf)from txtransfers#(lf)where [from] in ('MinnowBooster')"]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"timestamp", type date}}),
#"Filtered Rows1" = Table.SelectRows(#"Changed Type", each [timestamp] > #date(2018, 11, 30)),
#"Filtered Rows" = Table.SelectRows(#"Filtered Rows1", each Text.Contains([memo], "started")),
#"Inserted Text Between Delimiters" = Table.AddColumn(#"Filtered Rows", "Text Between Delimiters", each Text.BetweenDelimiters([memo], "to ", " "), type text),
#"Renamed Columns" = Table.RenameColumns(#"Inserted Text Between Delimiters",{{"Text Between Delimiters", "lease to"}}),
#"Replaced Value" = Table.ReplaceValue(#"Renamed Columns","@","",Replacer.ReplaceText,{"lease to"}),
#"Inserted Text Between Delimiters1" = Table.AddColumn(#"Replaced Value", "Text Between Delimiters", each Text.BetweenDelimiters([memo], " ", " ", 16, 0), type text),
#"Renamed Columns1" = Table.RenameColumns(#"Inserted Text Between Delimiters1",{{"Text Between Delimiters", "no of repayments"}}),
#"Inserted Text Between Delimiters2" = Table.AddColumn(#"Renamed Columns1", "Text Between Delimiters", each Text.BetweenDelimiters([memo], " ", " ", 20, 0), type text),
#"Renamed Columns2" = Table.RenameColumns(#"Inserted Text Between Delimiters2",{{"Text Between Delimiters", "each payment"}}),
#"Changed Type1" = Table.TransformColumnTypes(#"Renamed Columns2",{{"each payment", type number}, {"no of repayments", type number}}),
#"Added Custom" = Table.AddColumn(#"Changed Type1", "Repayment", each [no of repayments]*[each payment])
in
#"Added Custom"
Audit Test 5: Can we confirm the actual transfers for interest payments are in fact made?
Finally, we filtered the transfers table to include ‘active Marketplace delegations got you a daily’. A random spot check of amounts paid against the memos returned a 100% confirmation.
This is the M Code used to extract data from the blockchain on payments made.
let
Source = Sql.Database("vip.steemsql.com", "DBsteem", [Query="select *#(lf)from txtransfers#(lf)where [from] in ('MinnowBooster')"]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"timestamp", type date}}),
#"Filtered Rows1" = Table.SelectRows(#"Changed Type", each [timestamp] > #date(2018, 11, 30)),
#"Filtered Rows" = Table.SelectRows(#"Filtered Rows1", each Text.Contains([memo], "payout"))
in
#"Filtered Rows"
Audit Test 6: Test for current % APR
Although it was expected to see a lower than current APR for the test period due to downward pressure on the market, a sample of data was examined to test the currently reported APR. this was carried out on data pulled by Audit test 4. The data was filtered to see leases created in the last week and based on the comments in the memos, which have proven to be reliable from other tests, the average APR for new leases set up tests positive for a higher average than the data in the original time frame.
Shameless Promotion
Like what we are doing? Don't forget to vote for @steemcommunity as your steem witness. You can vote for our witness using SteemConnect here: https://steemconnect.com/sign/account-witness-vote?witness=steemcommunity&approve=1
Disclaimer. I am not a financial advisor and by no means has this to be taken as financial advice.