Before anything I would like to extend my sincere thanks to @zaki , @slamper ,@sunnya97 , @katernoir & @JayB for answering questions along the way that helped me immensely to draft this proposal. This was a steep learning curve for me and if it weren’t for their support I would not have gotten far.
DRAFT : : A Proposal :
A humble request to the Community & Validators of the Cosmos Hub to help the fundraiser participants who have lost their seed.
*Please note that this proposal shall not be implemented until the next breaking change is required.
*i.e : There will be no breaking change for the sole purpose of helping the recovery of funds.
*This proposal is only for genesis block accounts. This proposal does not set a precedent for future lost atoms or hacks.
*As off on August 30th 4:50 am (UTC time) approximately Only 1.72% (of current supply) of the atoms from genesis accounts have not shown any activity (Excluding AIB and ICF funds) .
*Also it is highly possible that the eventual number to be recovered is Actually Less Than 1.72% because some participants may still have their seed , but have not broadcast a single transaction yet.
Section 1 : Bitcoin donors
Question1 : Who does this affect ?
Answer1 : It applies to
- Participants who contributed to the fundraiser using a Bitcoin transaction(s) , and
- have lost their 12 word seed, and
- have the ability to sign messages with the Bitcoin address(es) that were used to
contribute to the fundraiser.
Question2 : What is this proposal ?
Answer2 : If a fundraiser participant satisfies all three pre-conditions from (Answer1), the validators will allow
for the lost atoms to be recovered to a cosmos address that is controlled by the fundraiser participant.
Question3 : May we have an example ?
Answer3 : Here is an example from the public Bitcoin blockchain.
Explanation:
1. 35ty8iaSbWsj4YVkoHzs9pZMze6dapeoZ8 is the fundraiser contribution address.
2. 1JQd4WSuTaVrGE7z8LiFJSHyYvMLS7Ce1y is the intermediary address that was provided to the participant.
3. Once the participant transferred their funds to the intermediary address , then there was another
transaction that sent the funds from the intermediary address to the fundraiser contribution address.
4. The Participant used 4 address in this case to fund the intermediary address.
3PsXjWRJonBWWjWgVodfztnWskUBtEuC3q , 3ELQuVZ6AnDFWtJWB9GrSnUntRidgdNU5w,
3BBhZfcXjgTwAbFtRKay8UZJ59PkMz9BA2 and 3EDeHiXpz2nNiqQC5kTCjnTBaFkC6cdQbH.
5. The OP_RETURN value for the transaction from the intermediary address to the fundraiser contribution
is be73ddf5f8f7aa58fb07a3395818d3116ff0043d.
6. Using this tool https://slowli.github.io/bech32-buffer/ we can determine the public cosmos address
(i) Select the Data Tab on the left
(ii) Enter "cosmos" in the Tag field.
(iii) Enter OP_RETURN value "be73ddf5f8f7aa58fb07a3395818d3116ff0043d" in the data field.
(iv) Click the Encode Button
(v) The public cosmos address "cosmos1heeama0c774937c85vu4sxxnz9hlqppa8lgdzc" is displayed.
(vi) This public cosmos address can be verified to be a genesis atom holder on the block explorer
7.If the Participant can sign any message that the Validators request them to with
any or all of the 4 addresses mentioned above in point (4) of (Answer3) then they
are eligible to have their atoms recovered and sent to an address under their control using the upgrade
script in the next breaking change.
Section 2 : Ethereum Donors
Question1 : Who does this affect ?
Answer1 : It applies to
- Participants who contributed to the fundraiser using an Ethereum transaction, and
- have lost their 12 word seed, and
- have the ability to sign messages with the ethereum address that was used to contribute in
the fundraiser
Question2 : What is this proposal ?
Answer2 : If a fundraiser participant satisfies all three pre-conditions from (Answer1), the validators will allow
for the lost atoms to be recovered to a cosmos address that is controlled by the fundraiser participant.
Question3 : May we have an example ?
Answer3. Here is an example from the public Ethereum Blockchain
Explanation:
1. 0xcf965cfe7c30323e9c9e41d4e398e2167506f764 is the fundraiser contribution smart contract.
2. The participant used 0xfaae1f6ce3d3108644c188555ae20e269f688c56 to donate eth to the contribution
smart contract address.
3. In the Event log , under "Received" , the value of "returnAddr" which is of type "address" is
8666c62b94a90706580521b57c138c12e661c196
4. Using this tool https://slowli.github.io/bech32-buffer/ we can determine the public cosmos address
(i) Select the Data Tab on the left
(ii) Enter "cosmos" in the Tag field.
(iii) Enter "returnAddr" value "8666c62b94a90706580521b57c138c12e661c196" in the data field.
(iv) Click the Encode Button
(v) The public cosmos address "cosmos1senvv2u54yrsvkq9yx6hcyuvztnxrsvkuzdenh" is displayed.
(vi) This public cosmos address can be verified to be a genesis atom holder on the block explorer
5. If the participant can sign any message that the Validators request them to with the address in (2)
then they are eligible to have their atoms recovered and sent to an address under their control using
the upgrade script in the next breaking change.
Section 3 : Saving old and new_recovery cosmos address via github submissions and using it in the upgrade script.
- Eligible bitcoin contributors in the fundraiser will submit a JSON message like so, to the github repo.
{
"fundraiser_txid":"e9060785ea3a26c348dbd7c31bccc9bc31150c2cf580c9cd57bb5e5405a0ab4f",
"fundraiser_btc_deposit_address":"1JQd4WSuTaVrGE7z8LiFJSHyYvMLS7Ce1y",
"fundraiser_btc_contrib_address":"3EDeHiXpz2nNiqQC5kTCjnTBaFkC6cdQbH",
"fundraiser_cosmos_hex_address":"be73ddf5f8f7aa58fb07a3395818d3116ff0043d",
"fundraiser_cosmos_bech32_address":"cosmos1heeama0c774937c85vu4sxxnz9hlqppa8lgdzc",
"recovery_message":"Please move coins from cosmos1heeama0c774937c85vu4sxxnz9hlqppa8lgdzc to cosmos1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ",
"recovery_message_signed":"Placeholder for recovery_proposal_message signed with fundraiser_btc_contrib_address",
"recovery_cosmos_hex_address":"ffffffffffffffffffffffffffffffffffffff",
"recovery_cosmos_bech32_address":"cosmos1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
- Eligible ethereum contributors in the fundraiser will submit a JSON message like so, to the github repo.
{
"fundraiser_txid": "0x9f63326afb29ac396a4e0ce4ccf8681d643dbe30e218fee6b4241ecc06a0ab24",
"fundraiser_eth_deposit_address": "0xcf965cfe7c30323e9c9e41d4e398e2167506f764",
"fundraiser_eth_contrib_address": "0xfaae1f6ce3d3108644c188555ae20e269f688c56",
"fundraiser_cosmos_hex_address": "8666c62b94a90706580521b57c138c12e661c196",
"fundraiser_cosmos_bech32_address": "cosmos1senvv2u54yrsvkq9yx6hcyuvztnxrsvkuzdenh",
"recovery_message": "Please move coins from cosmos1senvv2u54yrsvkq9yx6hcyuvztnxrsvkuzdenh to cosmos1yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy ",
"recovery_message_signed": "Placeholder for recovery_proposal_message signed with fundraiser_eth_contrib_address",
"recovery_cosmos_hex_address":"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"recovery_cosmos_bech32_address":"cosmos1yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}
- The cumulative json file from submissions based on (1) and (2) will look like this .
Please note that there may be more than one submission to bitcoin_donations or ethereum_donations.
{
"bitcoin_donations":[
{
"fundraiser_txid":"e9060785ea3a26c348dbd7c31bccc9bc31150c2cf580c9cd57bb5e5405a0ab4f",
"fundraiser_btc_deposit_address":"1JQd4WSuTaVrGE7z8LiFJSHyYvMLS7Ce1y",
"fundraiser_btc_contrib_address":"3EDeHiXpz2nNiqQC5kTCjnTBaFkC6cdQbH",
"fundraiser_cosmos_hex_address":"be73ddf5f8f7aa58fb07a3395818d3116ff0043d",
"fundraiser_cosmos_bech32_address":"cosmos1heeama0c774937c85vu4sxxnz9hlqppa8lgdzc",
"recovery_message":"Please move coins from cosmos1heeama0c774937c85vu4sxxnz9hlqppa8lgdzc to cosmos1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ",
"recovery_message_signed":"Placeholder recovery_proposal_message signed with fundraiser_btc_contrib_address",
"recovery_cosmos_hex_address":"ffffffffffffffffffffffffffffffffffffff",
"recovery_cosmos_bech32_address":"cosmos1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
],
"ethereum_donations":[
{
"fundraiser_txid":"0x9f63326afb29ac396a4e0ce4ccf8681d643dbe30e218fee6b4241ecc06a0ab24",
"fundraiser_eth_deposit_address":"0xcf965cfe7c30323e9c9e41d4e398e2167506f764",
"fundraiser_eth_contrib_address":"0xfaae1f6ce3d3108644c188555ae20e269f688c56",
"fundraiser_cosmos_hex_address":"8666c62b94a90706580521b57c138c12e661c196",
"fundraiser_cosmos_bech32_address":"cosmos1senvv2u54yrsvkq9yx6hcyuvztnxrsvkuzdenh",
"recovery_message":"Please move coins from cosmos1senvv2u54yrsvkq9yx6hcyuvztnxrsvkuzdenh to cosmos1yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy ",
"recovery_message_signed":"Placeholder for recovery_proposal_message signed with fundraiser_eth_contrib_address",
"recovery_cosmos_hex_address":"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"recovery_cosmos_bech32_address":"cosmos1yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}
]
}
- The upgrade script in contrib/export will contain code to
(i) parse through the arrays from (3) .
(ii) Verify that recovery_proposal_message_signed is indeed signed by fundraiser_btc_contrib_address or fundraiser_eth_contrib_address.
(iii) Create a recovery dictionary with "old_cosmos_address" : "new_cosmos_address" as key-value pairs .
(iv) Use the recovery dictionary from (ii) to replace old addreses with new addresses ( Example code in the gist below)
# ------------------------------------------------------------------
def recovery(accounts):
#Format of each key-value pair in the dictionary is "old_cosmos_address" :"new_cosmos_address".
#This will be available and retrieved from data in submitted by the eligible fundraiser participants
#to recover lost genesis atoms int github.
recoveryDict = dict({"cosmosaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":"cosmosxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"cosmosbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb":"cosmosyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"})
for x in accounts:
if(int(x['account_number']) < 1026):
if(x['address'] in recoveryDict):
temp = x['address']
x['address'] = recoveryDict.get(x['address'])
recoveryDict.pop(temp,None)
if(len(recoveryDict) == 0):
break
return accounts
# -------------------------------------------------------------------
genesis['app_state']['accounts'] = recovery(genesis['app_state']['accounts'])
#For reference a past upgrade script is present here :
https://github.com/cosmos/cosmos-sdk/blob/master/contrib/export/v0.33.x-to-v0.34.0.py
Section 5 : Funding this proposal.
This section is is a list people and or entities willing to fund this proposal .
This may include those who have lost their seed or , are doing it out of kindness.
The total number of Atoms required to fund this proposal is 512 Atoms.
Please note the proposal is still evolving and may change depending on feedback from the community and validators .
- @vee_em : 30 ATOM
-
@katernoir : Representing StakingFacilities.com : 200 ATOM (Conditional)
(i) 20% donation of recovered funds to the community pool
(ii) One time proposal only , Recovery request window needs to be determined . - @cryptic_monk : 100 ATOM
- cosmostation.io : 100 ATOM.
82 ATOMs more are required to fund this proposal.
Section 6 : For Eligible Participants
Please submit your public txid from the fundraiser in this forum and it will be added here .
The Json required can be computed from that . The message to be signed will be decided if and after the proposal passes.
Contributions
- eb5dd90216d8f9f7f5dcd3d54e4ad0b0dd34f5602d7b779b71ae338fc6586846 ( 1 BTC )
- 331db408685ff221193e88e0d548493920ab785e2d62f3898ce807463afc11e3 ( 0.4 BTC )
- 0xe2bb8c832c237b9ed898d4616649347e84931d56b8942cb409cafd6b01e1913d ( 24 ETH)
- 0x42d0f860e1cd484f51647f34479843008b69d8f1158c94ad44ae30df33fdc080 (16 eth)
- f1033af3d9b7bc9e5675acf74940d982acda6848a5e0e9234ead0f6043f2fc65 (12 BTC)
- 1a51fbb14d14ffb6270ddf551408069e22726ca2fbd8fd49ab5301f1157ff631 (10 BTC)
- ed6598ff038f1beaf1e1fe1c32aa50f770eaf16e6b7b86f45ed565837e546f05 (3 BTC)