Skip to content
This repository has been archived by the owner on Jan 30, 2024. It is now read-only.

@osdnk/t #119

Open
wants to merge 97 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
a68a43b
chore: remove unused scripts
shottah Nov 9, 2022
531e5b4
chore: disable firebase for dev builds
shottah Nov 9, 2022
e616fdc
chore: update podfile
shottah Nov 9, 2022
dfc28e3
fix: remove valora branding entirely
shottah Nov 10, 2022
41e59ce
WIP - Keygen + Signing working
codyborn Nov 29, 2022
591ed79
WIP - Capsule Wallet
codyborn Dec 2, 2022
8688f22
WIP - attempting to get Recovery signer in wallet
codyborn Dec 7, 2022
a7b4a8b
Recovery + User working in parallel
codyborn Dec 7, 2022
1ea9e30
WIP
codyborn Dec 8, 2022
e9fd0b5
Add create wallet import
osdnk Dec 8, 2022
44f386d
User Management API working
codyborn Dec 8, 2022
123edb5
Temp removing client lib
codyborn Dec 8, 2022
dda9b5b
Demo ready
codyborn Dec 9, 2022
6bbddf5
Create wallet from library
osdnk Dec 12, 2022
2390e42
Fix send transaction (#1)
osdnk Dec 14, 2022
f7ea3ac
iOS logic (#3)
osdnk Dec 21, 2022
99e91a7
userManagementClient
osdnk Dec 21, 2022
2648964
prepSignMessage
osdnk Dec 21, 2022
f4e527f
createUser / verify e-mail
osdnk Dec 21, 2022
9eec2f3
ChallengeStorage + PrivateKeyStorage stubs
osdnk Dec 25, 2022
c96deee
Fix wallets iteration
osdnk Dec 29, 2022
bdf5134
extract out UserManagementClient
osdnk Dec 29, 2022
4de1fa9
Set up cookie refreshing skeleton (#7)
osdnk Dec 30, 2022
28fd364
Batter cookie parsing
osdnk Dec 30, 2022
d4e84e2
Persisting across session / foundation for Keychain support (#6)
osdnk Jan 2, 2023
293c780
Create a fake flow to create a new user (#8)
osdnk Jan 2, 2023
8329903
Cookie flow (#9)
osdnk Jan 4, 2023
e982511
use relative path instead of asolute for signer.arr in Android
osdnk Jan 5, 2023
56d531c
Keychain support 1/2 (#10)
osdnk Jan 6, 2023
ff63b84
Extract out URLs
osdnk Jan 10, 2023
150553b
console.log(e)
osdnk Jan 10, 2023
2b116ab
remove console.log('MMMMM')
osdnk Jan 10, 2023
a04ab1a
ReactNativePrivateKeyStorage
osdnk Jan 10, 2023
e28ffeb
Implement SignPersonalMessage
codyborn Jan 11, 2023
99aa12f
Code re-org (#13)
osdnk Jan 11, 2023
24d2a52
Keychain 2/2 - post refactor (#14)
osdnk Jan 11, 2023
ad23b6d
RCT_EXPORT_METHOD setServerUrl
osdnk Jan 11, 2023
c76be04
Merge upstream
codyborn Jan 11, 2023
65faf9b
Fix typings
osdnk Jan 17, 2023
e23f5aa
createUser, verifyEmail helpers
osdnk Jan 17, 2023
567d687
revert typo
osdnk Jan 17, 2023
a47805b
Merge pull request #15 from capsule-org/cody/SignPersonalMessage
codyborn Jan 18, 2023
7cf0a18
Avoid usage of "biometric" word (#16)
osdnk Jan 19, 2023
793e8ac
Remove Kolektivo dependencies (#17)
codyborn Jan 26, 2023
c17b404
Native bindings for refresh (#18)
osdnk Jan 26, 2023
8674c0f
Fix imports
osdnk Jan 26, 2023
d96d9e5
extract out logger
osdnk Jan 26, 2023
6dfc93e
Merge branch 'capsule' of github.com:capsule-org/kolektivo-wallet int…
osdnk Jan 26, 2023
d454446
Bump UMC
osdnk Jan 26, 2023
34a35c9
proxy -- SSL (#20)
osdnk Jan 31, 2023
c10d951
Extract out capsule SDK (#22)
osdnk Feb 1, 2023
3fe8ae3
Key Recovery: Capsule Wallet + Signer (#19)
codyborn Feb 2, 2023
1753c16
Different keys for refreshing session + tests (#23)
osdnk Feb 2, 2023
6d7540b
Wrapping up recovery (#24)
osdnk Feb 2, 2023
ba7ab4f
login + recovery (#25)
osdnk Feb 6, 2023
ac8fabd
beta env
osdnk Feb 6, 2023
2f040e2
bump!
osdnk Feb 6, 2023
50202d2
Make ts happy again
osdnk Feb 6, 2023
2046b6a
Make TS happy again
osdnk Feb 6, 2023
e4d16a4
bump
osdnk Feb 6, 2023
2e5b784
remove console.log
osdnk Feb 7, 2023
b34f60f
Fix building process of the library
osdnk Feb 9, 2023
5c54613
Merge branch 'capsule' of github.com:capsule-org/kolektivo-wallet int…
osdnk Feb 9, 2023
c702e6e
Bump
osdnk Feb 9, 2023
cb9fb19
Developer Docs (#26)
codyborn Feb 14, 2023
0d75137
Fix after Cody's changes (#27)
osdnk Feb 14, 2023
94c1a94
Hide private and deprecated methods from docs (#28)
codyborn Feb 14, 2023
3c81964
Fix keyshare getting / setting
osdnk Feb 17, 2023
496295c
Bump
osdnk Feb 17, 2023
6f008a3
Transition helpers (#29)
osdnk Feb 22, 2023
40fd37a
Fix case TransmissionUtils.ts -> transmissionUtils.ts
osdnk Feb 22, 2023
14ef7e3
lint
osdnk Feb 22, 2023
94cc7eb
Bump
osdnk Feb 22, 2023
bf430cc
bump UMC
osdnk Feb 23, 2023
8879d53
bump v
osdnk Feb 23, 2023
678c89c
retry authentication on each error + version bump
osdnk Mar 1, 2023
6dcc454
tests fixes
osdnk Mar 9, 2023
eca7b55
fix test
osdnk Apr 18, 2023
711d4c2
Fix test!
osdnk Apr 19, 2023
7d4416d
Bump
osdnk Apr 19, 2023
fc9d889
temp: has account
osdnk Apr 24, 2023
8ac73f1
temp version
osdnk Apr 24, 2023
5ef166c
Update readme for npm
nityas May 4, 2023
7e0a4f4
subarray(1) -> slice(1)
osdnk Jun 6, 2023
f8cec24
random ignore
osdnk Jun 6, 2023
8aa126d
Bump
osdnk Jun 6, 2023
92df2a9
Expose new methods (#30)
osdnk Jun 30, 2023
550b2a3
Bump
osdnk Jun 30, 2023
f3c1236
POC
osdnk Jul 11, 2023
9f90858
more libs + new user management client
osdnk Jul 12, 2023
2cd42da
applied inside wallet
osdnk Jul 12, 2023
73b65eb
complete work
osdnk Jul 12, 2023
b43949b
lint
osdnk Jul 12, 2023
7a4ebc8
LoginFlow.quasitest.ts revert
osdnk Jul 12, 2023
57e946b
PR 1
osdnk Jul 13, 2023
2e866f0
Remove old package
osdnk Jul 13, 2023
e0c7250
userid + email
osdnk Jul 13, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
WIP - Capsule Wallet
  • Loading branch information
codyborn committed Dec 2, 2022
commit 591ed7984566d9a5a211927506b93985799b0774
59 changes: 59 additions & 0 deletions android/app/src/main/java/org/celo/mobile/CapsuleSignerModule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package org.celo.mobile;

import android.util.Log;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import signer.Signer;

public class CapsuleSignerModule extends ReactContextBaseJavaModule {
static final String TAG = "CapsuleSignerModule";

String ids = "[\"USER\",\"RECOVERY\",\"CAPSULE\"]";
int threshold = 2;
String userId = "USER";
String recoveryId = "RECOVERY";
String serverUrl = "http://mpcnetworkloadbalancer-348316826.us-west-1.elb.amazonaws.com";
String configBase =
"{\"ServerUrl\": \"%s\", \"WalletId\": \"%s\", \"Id\":\"%s\", \"Ids\":%s, \"Threshold\":1}";

CapsuleSignerModule(ReactApplicationContext context) {
super(context);
}

@Override
public String getName() {
return "CapsuleSignerModule";
}

/**
* Perform distributed key generation with the Capsule server
*
* @param protocolId
* @return
*/
@ReactMethod(isBlockingSynchronousMethod = true)
public String createAccount(String walletId, String protocolId) {
String userStr = String.format(configBase, serverUrl, walletId, userId, ids);
String recoveryStr = String.format(configBase, serverUrl, walletId, recoveryId, ids);

// Run DKG as both user and recovery
// Signer.createAccount(serverUrl, recoveryStr, protocolId);
return Signer.createAccount(serverUrl, userStr, protocolId);
}

@ReactMethod(isBlockingSynchronousMethod = true)
public String getAddress(String serializedSigner) {
return Signer.getAddress(serializedSigner);
}

@ReactMethod(isBlockingSynchronousMethod = true)
public String sendTransaction(String protocolId, String serializedSigner, String transaction) {
return Signer.sendTransaction(serverUrl, serializedSigner, "hello world", protocolId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import java.util.Collections;
import java.util.List;

public class SignerPackage implements ReactPackage {
public class CapsuleSignerPackage implements ReactPackage {

@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
Expand All @@ -19,7 +19,7 @@ public List<ViewManager> createViewManagers(ReactApplicationContext reactContext
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();

modules.add(new SignerModule(reactContext));
modules.add(new CapsuleSignerModule(reactContext));

return modules;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public boolean getUseDeveloperSupport() {
protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
packages.add(new SignerPackage());
packages.add(new CapsuleSignerPackage());
return packages;
}

Expand Down
66 changes: 0 additions & 66 deletions android/app/src/main/java/org/celo/mobile/SignerModule.java

This file was deleted.

11 changes: 8 additions & 3 deletions src/account/saga.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,12 @@ import { restartApp } from 'src/utils/AppRestart'
import Logger from 'src/utils/Logger'
import { getContractKit, getWallet } from 'src/web3/contracts'
import { registerAccountDek } from 'src/web3/dataEncryptionKey'
import { getOrCreateAccount, getWalletAddress, unlockAccount } from 'src/web3/saga'
import {
getOrCreateAccount,
getOrCreateCapsuleAccount,
getWalletAddress,
unlockAccount,
} from 'src/web3/saga'
import { walletAddressSelector } from 'src/web3/selectors'
import { finclusiveKycStatusSelector } from './selectors'

Expand Down Expand Up @@ -88,8 +93,8 @@ function* initializeAccount() {
Logger.debug(TAG + '@initializeAccount', 'Creating account')
try {
ValoraAnalytics.track(OnboardingEvents.initialize_account_start)
yield call(getOrCreateAccount)
yield call(generateSignedMessage)
yield call(getOrCreateCapsuleAccount)
//yield call(generateSignedMessage)
yield put(refreshAllBalances())
Logger.debug(TAG + '@initializeAccount', 'Account creation success')
ValoraAnalytics.track(OnboardingEvents.initialize_account_complete)
Expand Down
4 changes: 3 additions & 1 deletion src/app/ErrorMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,5 +94,7 @@ export enum ErrorMessages {
ADD_FIAT_ACCOUNT_RESOURCE_EXIST = 'fiatDetailsScreen.addFiatAccountResourceExist',
CREATE_PDF_FAILED = 'createPdfFailure',
FAILED_OPEN_DIRECTION = 'failedOpeningDirections',
CREATE_PDF_FAILED = 'createPdfFailure',
CAPSULE_FETCH_ACCOUNTS = 'capsuleFetchAccounts',
CAPSULE_ACCOUNT_ALREADY_EXISTS = 'capsuleAccountAlreadyExists',
CAPSULE_UNEXPECTED_ADDRESS = 'capsuleUnexpectedAddress',
}
51 changes: 44 additions & 7 deletions src/backup/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { currentAccountSelector } from 'src/web3/selectors'
const TAG = 'Backup/utils'

const MNEMONIC_STORAGE_KEY = 'mnemonic'
const CAPSULE_KEY_SHARE = 'capsule'

export function getMnemonicLanguage(language: string | null) {
switch (language?.slice(0, 2)) {
Expand All @@ -30,37 +31,73 @@ export function getMnemonicLanguage(language: string | null) {
}

export async function storeMnemonic(mnemonic: string, account: string | null, password?: string) {
return storeEncryptedSecret(MNEMONIC_STORAGE_KEY, mnemonic, account, password)
}

export async function storeCapsuleKeyShare(
mnemonic: string,
account: string | null,
password?: string
) {
return storeEncryptedSecret(CAPSULE_KEY_SHARE, mnemonic, account, password)
}

async function storeEncryptedSecret(
storageKey: string,
mnemonic: string,
account: string | null,
password?: string
) {
if (!account) {
throw new Error('Account not yet initialized')
}
const passwordToUse = password ?? (await getPassword(account))
const encryptedMnemonic = await encryptMnemonic(mnemonic, passwordToUse)
return storeItem({ key: MNEMONIC_STORAGE_KEY, value: encryptedMnemonic })
return storeItem({ key: storageKey, value: encryptedMnemonic })
}

export async function clearStoredMnemonic() {
await removeStoredItem(MNEMONIC_STORAGE_KEY)
}

export async function clearCapsuleKeyShare() {
await removeStoredItem(CAPSULE_KEY_SHARE)
}

export async function getStoredMnemonic(
account: string | null,
password?: string
): Promise<string | null> {
return getStoredEncryptedSecret(MNEMONIC_STORAGE_KEY, account, password)
}

export async function getStoredCapsuleKeyShare(
account: string | null,
password?: string
): Promise<string | null> {
return getStoredEncryptedSecret(CAPSULE_KEY_SHARE, account, password)
}

async function getStoredEncryptedSecret(
storageKey: string,
account: string | null,
password?: string
): Promise<string | null> {
try {
if (!account) {
throw new Error('Account not yet initialized')
}

Logger.debug(TAG, 'Checking keystore for mnemonic')
const encryptedMnemonic = await retrieveStoredItem(MNEMONIC_STORAGE_KEY)
if (!encryptedMnemonic) {
const encryptedSecret = await retrieveStoredItem(storageKey)
if (!encryptedSecret) {
throw new Error('No mnemonic found in storage')
}

const passwordToUse = password ?? (await getPassword(account))
return decryptMnemonic(encryptedMnemonic, passwordToUse)
return decryptSecret(encryptedSecret, passwordToUse)
} catch (error) {
Logger.error(TAG, 'Failed to retrieve mnemonic', error)
Logger.error(TAG, 'Failed to retrieve secret', error)
return null
}
}
Expand Down Expand Up @@ -111,7 +148,7 @@ export async function encryptMnemonic(phrase: string, password: string) {
return CryptoJS.AES.encrypt(phrase, password).toString()
}

export async function decryptMnemonic(encryptedMnemonic: string, password: string) {
const bytes = CryptoJS.AES.decrypt(encryptedMnemonic, password)
export async function decryptSecret(encryptedSecret: string, password: string) {
const bytes = CryptoJS.AES.decrypt(encryptedSecret, password)
return bytes.toString(CryptoJS.enc.Utf8)
}
Loading