| 
						
						
							
								
							
						
						
					 | 
					@ -26,44 +26,49 @@ trap 'rm -rf "$TMPDIR"' EXIT | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					initialize_account() { | 
					 | 
					 | 
					initialize_account() { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    # Generate or load mnemonic | 
					 | 
					 | 
					    # Generate or load mnemonic | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    if [ ! -f "mnemonic.txt" ]; then | 
					 | 
					 | 
					    if [ ! -f "mnemonic.txt" ]; then | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					        # Generate 24-word mnemonic using Python | 
					 | 
					 | 
					        # Generate entropy and convert to hex | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        python3 -c " | 
					 | 
					 | 
					        openssl rand -hex 32 > mnemonic.txt | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					from eth_account.hdaccount import generate_mnemonic | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					print(generate_mnemonic(language='english')) | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					" > mnemonic.txt | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    fi | 
					 | 
					 | 
					    fi | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					     | 
					 | 
					 | 
					     | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    # Read and process mnemonic | 
					 | 
					 | 
					    # Read entropy | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    MNEMONIC=$(cat mnemonic.txt) | 
					 | 
					 | 
					    ENTROPY=$(cat mnemonic.txt) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					     | 
					 | 
					 | 
					     | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    # Derive address and keys using Python | 
					 | 
					 | 
					    # Create temporary directory for key operations | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    IDENTITY=$(python3 -c " | 
					 | 
					 | 
					    TMPDIR=$(mktemp -d) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					from eth_account import Account | 
					 | 
					 | 
					    trap 'rm -rf "$TMPDIR"' EXIT | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					from eth_keys import keys | 
					 | 
					 | 
					     | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					import json | 
					 | 
					 | 
					    # Generate secp256k1 private key | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					    openssl ecparam -name secp256k1 -genkey -noout -out "$TMPDIR/private.pem" | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					Account.enable_unaudited_hdwallet_features() | 
					 | 
					 | 
					     | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					mnemonic = '$MNEMONIC'.strip() | 
					 | 
					 | 
					    # Extract private key in hex format | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					account = Account.from_mnemonic(mnemonic) | 
					 | 
					 | 
					    PRIVATE_KEY=$(openssl ec -in "$TMPDIR/private.pem" -text -noout 2>/dev/null |  | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					address = account.address | 
					 | 
					 | 
					        grep priv -A 3 | tail -n +2 | tr -d '\n[:space:]:' | cut -c3-) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					private_key = account.key.hex()[2:] | 
					 | 
					 | 
					     | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					pk = keys.PrivateKey(account.key) | 
					 | 
					 | 
					    # Generate public key and address | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					public_key = pk.public_key.to_hex()[2:] | 
					 | 
					 | 
					    PUBLIC_KEY=$(openssl ec -in "$TMPDIR/private.pem" -pubout -outform DER 2>/dev/null |  | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					        tail -c 65 | xxd -p -c 65) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					identity = { | 
					 | 
					 | 
					     | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    'did': f'did:ethr:{address}', | 
					 | 
					 | 
					    # Generate Ethereum address (last 20 bytes of keccak256 of public key) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    'keys': [{ | 
					 | 
					 | 
					    ADDRESS=$(echo -n "$PUBLIC_KEY" | xxd -r -p |  | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        'id': f'did:ethr:{address}#keys-1', | 
					 | 
					 | 
					        openssl dgst -sha3-256 -binary |  | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        'type': 'Secp256k1VerificationKey2018', | 
					 | 
					 | 
					        tail -c 20 | xxd -p) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        'controller': f'did:ethr:{address}', | 
					 | 
					 | 
					     | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        'ethereumAddress': address, | 
					 | 
					 | 
					    # Create identity JSON | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        'publicKeyHex': public_key, | 
					 | 
					 | 
					    IDENTITY=$(cat <<EOF | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        'privateKeyHex': private_key | 
					 | 
					 | 
					{ | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    "did": "did:ethr:0x${ADDRESS}", | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    "keys": [{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        "id": "did:ethr:0x${ADDRESS}#keys-1", | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        "type": "Secp256k1VerificationKey2018", | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        "controller": "did:ethr:0x${ADDRESS}", | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        "ethereumAddress": "0x${ADDRESS}", | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        "publicKeyHex": "${PUBLIC_KEY}", | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        "privateKeyHex": "${PRIVATE_KEY}" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    }], | 
					 | 
					 | 
					    }], | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    'services': [] | 
					 | 
					 | 
					    "services": [] | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					print(json.dumps(identity)) | 
					 | 
					 | 
					EOF | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					") | 
					 | 
					 | 
					) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    echo "Account initialized:" | 
					 | 
					 | 
					    echo "Account initialized:" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    echo "$IDENTITY" | jq . | 
					 | 
					 | 
					    echo "$IDENTITY" | jq . | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					
  |