Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Solana Provider using secure-background/client for web & xnfts #4213

Merged
merged 53 commits into from
Jun 23, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
01e8ca2
add madlads.com to wl
ph101pp May 29, 2023
ad21075
restructure secure-background
ph101pp May 31, 2023
de7d81a
Fully typed Client-Server requests
ph101pp Jun 1, 2023
6031406
setup secure background channels
ph101pp Jun 2, 2023
3feef39
End to end working message signing through new client and secure-back…
ph101pp Jun 2, 2023
e7bf3f4
Working Content->background->UI->background->Content message passing
ph101pp Jun 3, 2023
3f66501
Merge branch 'master' into philipp/secure-background-core
ph101pp Jun 3, 2023
628783f
Split secure-background & secure-client
ph101pp Jun 5, 2023
43e5777
secure-background/clients exports
ph101pp Jun 5, 2023
f3a2067
Merge branch 'master' into philipp/secure-background-core
ph101pp Jun 12, 2023
b39e392
Clarify Transport From/To naming + correctly close Popup after openin…
ph101pp Jun 12, 2023
9db8ad6
Add ExtensionTransports and solidify Error handling
ph101pp Jun 12, 2023
52bc4e9
UnlockKeyring event + new extension message passing
ph101pp Jun 13, 2023
58f0627
Combine SecureUI and SecureBackground events + add transports to recoil
ph101pp Jun 14, 2023
130e5e0
fix build:fresh
ph101pp Jun 14, 2023
012469b
Merge branch 'master' into philipp/secure-background-core
ph101pp Jun 14, 2023
2c3899b
Add secure-client to dockerfiles
ph101pp Jun 14, 2023
c568de2
Add request.origin
ph101pp Jun 14, 2023
fba97dc
Add tamagui to secure-client & fix circular dependencies
ph101pp Jun 14, 2023
1211ec8
fix devmode transport issues
ph101pp Jun 14, 2023
020b803
Working confirmation prompt
ph101pp Jun 14, 2023
c454070
Merge branch 'master' into philipp/secure-background-core
ph101pp Jun 14, 2023
0fa5d19
Create RequestResponder
ph101pp Jun 14, 2023
ceb43e6
e2e solana signMessage w/o unlock & approve origin
ph101pp Jun 15, 2023
6c8dd99
SecureStore refactor
ph101pp Jun 15, 2023
1cfaae7
Merge branch 'master' into philipp/secure-background-core
ph101pp Jun 15, 2023
667e604
Remove secure-client import from solana provider for merge
ph101pp Jun 15, 2023
f583a4b
Lock down deprecated and private methods in SecureStore
ph101pp Jun 15, 2023
a3a1828
Clean up KeyringStoreState enum and move it to secure-background/types
ph101pp Jun 16, 2023
da8c40d
Merge branch 'master' into philipp/secure-background-core-rebased
ph101pp Jun 16, 2023
f2eb471
Lock down deprecated and private methods in SecureStore
ph101pp Jun 15, 2023
74a62ac
Clean up KeyringStoreState enum and move it to secure-background/types
ph101pp Jun 16, 2023
814cd95
Fetch user data from secureUI
ph101pp Jun 16, 2023
7ee9262
move origin from clients to transport.
ph101pp Jun 16, 2023
03f078a
Setup SecureUI request subscription & queue
ph101pp Jun 16, 2023
6d4757f
Fix import issue.
ph101pp Jun 18, 2023
3743f79
cleanup
ph101pp Jun 18, 2023
9c0494f
animation improvement
ph101pp Jun 19, 2023
470cbb3
Sign Message request with forced unlock
ph101pp Jun 20, 2023
4ccf122
Solana provider connect
ph101pp Jun 21, 2023
d9846b5
Approve Origin Request
ph101pp Jun 21, 2023
971eaa5
Add solana disconnect
ph101pp Jun 21, 2023
3b6e71e
solana send & sendAndConfirm transaction
ph101pp Jun 22, 2023
e5a9bf7
Fix xnft connection -> use "enhanced" background connection
ph101pp Jun 22, 2023
c7400a2
Emit keyring unlocked event
ph101pp Jun 22, 2023
fa3febb
Use default Connection for backend/solana-connect and properly reset …
ph101pp Jun 22, 2023
fcbce99
Solana SignAllTransactions
ph101pp Jun 22, 2023
ad3b594
new NotificationsClient
ph101pp Jun 22, 2023
fbf638e
Cleanup and logging
ph101pp Jun 22, 2023
5654918
Merge branch 'master' into philipp/secure-background-ui
ph101pp Jun 22, 2023
339afe1
separate extension & secureUI origins
ph101pp Jun 22, 2023
a88f75d
Cleanup + disable new provider
ph101pp Jun 22, 2023
c055135
remove console.log
ph101pp Jun 22, 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
e2e solana signMessage w/o unlock & approve origin
  • Loading branch information
ph101pp committed Jun 15, 2023
commit ceb43e6c17a33581320f61f5ac979adcb582b699
20 changes: 12 additions & 8 deletions packages/provider-core/src/provider-solana.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ import type {
VersionedTransaction,
} from "@solana/web3.js";
import { Connection, PublicKey } from "@solana/web3.js";
import { encode } from "bs58";
import { decode, encode } from "bs58";

import { PrivateEventEmitter } from "./common/PrivateEventEmitter";
import * as cmn from "./common/solana";
Expand Down Expand Up @@ -91,6 +91,7 @@ export class ProviderSolanaInjection
this.#secureSolanaClient = new SolanaClient(
new FromContentScriptTransportSender(),
{
context: "web",
name: document.title,
address: window.location.origin,
}
Expand Down Expand Up @@ -397,13 +398,16 @@ export class ProviderSolanaInjection
publicKey: (publicKey ?? this.#publicKey).toString(),
message: encode(msg),
});
console.log("PCA", solanaResponse);

return await cmn.signMessage(
publicKey ?? this.#publicKey,
this.#requestManager,
msg
);
if (!solanaResponse) {
throw new Error("signature failed");
}
return decode(solanaResponse);
// nocommit
// return await cmn.signMessage(
// publicKey ?? this.#publicKey,
// this.#requestManager,
// msg
// );
}

public get isBackpack() {
Expand Down
1 change: 1 addition & 0 deletions packages/secure-background/clients.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ export {
mockTransportReceiver,
mockTransportSender,
} from "./src/transports/mockTransports";
export { TransportResponder } from "./src/transports/TransportResponder";
2 changes: 1 addition & 1 deletion packages/secure-background/src/keyring/blockchain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ export class BlockchainKeyring {
walletAddress: string
): Promise<string> {
const keyring = this.getKeyring(walletAddress);
const msgBuffer = Buffer.from(decode(msg));
const msgBuffer = Buffer.from(msg);
return keyring.signMessage(msgBuffer, walletAddress);
}

Expand Down
4 changes: 1 addition & 3 deletions packages/secure-background/src/services/evm/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,14 @@ import type {
TransportSender,
} from "../../types/transports";

import type { SECURE_EVM_EVENTS, SECURE_EVM_SIGN_MESSAGE } from "./events";

export class EVMClient {
constructor(
private secureBackgroundClient: TransportSender,
private origin: SecureEventOrigin
) {}

public async signMessage(
request: SecureRequest<SECURE_EVM_SIGN_MESSAGE>["request"]
request: SecureRequest<"SECURE_EVM_SIGN_MESSAGE">["request"]
) {
await this.secureBackgroundClient.send({
name: "SECURE_EVM_SIGN_MESSAGE",
Expand Down
31 changes: 14 additions & 17 deletions packages/secure-background/src/services/evm/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@ import type { KeyringStore } from "../../store/keyring";
import type {
SecureRequest,
TransportHandler,
TransportHandlers,
TransportReceiver,
TransportRemoveListener,
TransportSender,
} from "../../types/transports";

import type {
SECURE_EVM_EVENTS,
SECURE_EVM_SIGN_MESSAGE,
SECURE_EVM_SIGN_TX,
} from "./events";
import type { SECURE_EVM_EVENTS } from "./events";

export class EVMService {
public destroy: TransportRemoveListener;
Expand All @@ -25,21 +22,21 @@ export class EVMService {
}

private eventHandler: TransportHandler<SECURE_EVM_EVENTS> = (request) => {
switch (request.name) {
case "SECURE_EVM_SIGN_MESSAGE":
return this.handleSignMessage(request);
case "SECURE_EVM_SIGN_TX":
return this.handleSign(request);
}
};
const handlers: TransportHandlers<SECURE_EVM_EVENTS> = {
SECURE_EVM_SIGN_MESSAGE: this.handleSignMessage,
SECURE_EVM_SIGN_TX: this.handleSign,
};

private handleSignMessage: TransportHandler<SECURE_EVM_SIGN_MESSAGE> = async (
request
) => {
throw "Not Implemented";
const handler = handlers[request.name]?.bind(this);
return handler && handler(request);
};

private handleSign: TransportHandler<SECURE_EVM_SIGN_TX> = async (
private handleSignMessage: TransportHandler<"SECURE_EVM_SIGN_MESSAGE"> =
async (request) => {
throw "Not Implemented";
};

private handleSign: TransportHandler<"SECURE_EVM_SIGN_TX"> = async (
request
) => {
throw "Not Implemented";
Expand Down
133 changes: 52 additions & 81 deletions packages/secure-background/src/services/svm/server.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,25 @@
import { Blockchain } from "@coral-xyz/common";

import type { KeyringStore } from "../../store/keyring";
import type { SECURE_EVENTS } from "../../types/events";
import type {
TransportHandler,
TransportHandlers,
TransportReceiver,
TransportRemoveListener,
TransportSender,
} from "../../types/transports";
import { SecureUIClient } from "../secureUI/client";

import type {
SECURE_SVM_EVENTS,
SECURE_SVM_SAY_HELLO,
SECURE_SVM_SIGN_ALL_TX,
SECURE_SVM_SIGN_MESSAGE,
SECURE_SVM_SIGN_TX,
} from "./events";
import type { SECURE_SVM_EVENTS } from "./events";

export class SVMService {
public destroy: TransportRemoveListener;
private secureUIClient: SecureUIClient;
private keyringStore: KeyringStore;

constructor(interfaces: {
secureReceiver: TransportReceiver<SECURE_SVM_EVENTS, "response">;
secureReceiver: TransportReceiver<SECURE_SVM_EVENTS>;
keyringStore: KeyringStore;
secureUISender: TransportSender<SECURE_SVM_EVENTS, "confirmation">;
}) {
Expand All @@ -35,91 +31,66 @@ export class SVMService {
}

private eventHandler: TransportHandler<SECURE_SVM_EVENTS> = (request) => {
switch (request.name) {
case "SECURE_SVM_SIGN_MESSAGE":
return this.handleSignMessage(request);
case "SECURE_SVM_SIGN_TX":
return this.handleSign(request);
case "SECURE_SVM_SIGN_ALL_TX":
return this.handleSignAll(request);
case "SECURE_SVM_SAY_HELLO":
return this.handleHello(request);
}
const handlers: TransportHandlers<SECURE_SVM_EVENTS> = {
SECURE_SVM_SIGN_MESSAGE: this.handleSignMessage,
SECURE_SVM_SIGN_TX: this.handleSign,
SECURE_SVM_SIGN_ALL_TX: this.handleSignAll,
SECURE_SVM_SAY_HELLO: this.handleHello,
};

const handler = handlers[request.name]?.bind(this);
return handler && handler(request);
};

private handleSignMessage: TransportHandler<SECURE_SVM_SIGN_MESSAGE> = async (
event
) => {
console.log("PCA HANDLE sign message", event);
// const confirm = await this.secureUISender.send(request)
const confirmation = await this.secureUIClient.confirm(event);

console.log("PCA confirmation", confirmation);
if (confirmation.error || !confirmation.response?.confirmed) {
return {
name: "SECURE_SVM_SIGN_MESSAGE",
error: "User Denied Request",
};
}

const blockchainKeyring =
this.keyringStore.activeUserKeyring.keyringForBlockchain(
Blockchain.SOLANA
private handleSignMessage: TransportHandler<"SECURE_SVM_SIGN_MESSAGE"> =
async (event) => {
console.log("PCA HANDLE sign message", event);
// const confirm = await this.secureUISender.send(request)
const confirmation = await this.secureUIClient.confirm(event.event);

console.log("PCA confirmation", confirmation);
if (confirmation.error || !confirmation.response?.confirmed) {
return event.error("User Denied Request");
}

const blockchainKeyring =
this.keyringStore.activeUserKeyring.keyringForBlockchain(
Blockchain.SOLANA
);

if (blockchainKeyring.ledgerKeyring) {
// open ledger prompt
}

const singedMessage = await blockchainKeyring.signMessage(
event.request.message,
event.request.publicKey
);

if (blockchainKeyring.ledgerKeyring) {
// open ledger prompt
}
if (blockchainKeyring.ledgerKeyring) {
// close ledger prompt
}

const singedMessage = await blockchainKeyring.signMessage(
event.request.message,
event.request.publicKey
);

if (blockchainKeyring.ledgerKeyring) {
// close ledger prompt
}
console.log("PCA responde to contentscript", singedMessage);

console.log("PCA responde to contentscript", singedMessage);

return {
name: "SECURE_SVM_SIGN_MESSAGE",
response: {
singedMessage,
},
return event.respond({ singedMessage });
};
};

private handleSign: TransportHandler<SECURE_SVM_SIGN_TX> = async ({
request,
}) => {
return {
name: "SECURE_SVM_SIGN_TX",
response: {
signedTx: "string",
},
};
private handleSign: TransportHandler<"SECURE_SVM_SIGN_TX"> = async (
event
) => {
return event.respond({ signedTx: "string" });
};

private handleHello: TransportHandler<SECURE_SVM_SAY_HELLO> = async ({
request,
}) => {
return {
name: "SECURE_SVM_SAY_HELLO",
response: {
message: "hello " + request.name,
},
};
private handleHello: TransportHandler<"SECURE_SVM_SAY_HELLO"> = async (
event
) => {
return event.respond({ message: "hello " + event.request.name });
};

private handleSignAll: TransportHandler<SECURE_SVM_SIGN_ALL_TX> = async ({
request,
private handleSignAll: TransportHandler<"SECURE_SVM_SIGN_ALL_TX"> = async ({
respond,
}) => {
return {
name: "SECURE_SVM_SIGN_ALL_TX",
response: {
signedTx: ["string"],
},
};
return respond({ signedTx: ["string"] });
};
}
57 changes: 20 additions & 37 deletions packages/secure-background/src/services/user/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ import type { KeyringStore } from "../../store/keyring";
import { KeyringStoreStateEnum } from "../../store/keyring";
import type {
TransportHandler,
TransportHandlers,
TransportReceiver,
TransportRemoveListener,
TransportSender,
} from "../../types/transports";
import { SecureUIClient } from "../secureUI/client";

import type { SECURE_USER_EVENTS, SECURE_USER_UNLOCK_KEYRING } from "./events";
import type { SECURE_USER_EVENTS } from "./events";

export class UserService {
public destroy: TransportRemoveListener;
Expand All @@ -27,56 +28,38 @@ export class UserService {
);
}

private eventHandler: TransportHandler<SECURE_USER_EVENTS> = (request) => {
switch (request.name) {
case "SECURE_USER_UNLOCK_KEYRING":
return this.handleUnlockKeyring(request);
}
private eventHandler: TransportHandler<SECURE_USER_EVENTS> = async (
request
) => {
const handlers: TransportHandlers<SECURE_USER_EVENTS> = {
SECURE_USER_UNLOCK_KEYRING: this.handleUnlockKeyring,
};

const handler = handlers[request.name]?.bind(this);
return handler && handler(request);
};

private handleUnlockKeyring: TransportHandler<SECURE_USER_UNLOCK_KEYRING> =
async (request) => {
private handleUnlockKeyring: TransportHandler<"SECURE_USER_UNLOCK_KEYRING"> =
async (event) => {
const uuid =
request.request.uuid ?? this.keyringStore.activeUserKeyring?.uuid;
event.request.uuid ?? this.keyringStore.activeUserKeyring?.uuid;
const keyringState = await this.keyringStore.state();

if (
keyringState === KeyringStoreStateEnum.Locked &&
request.request.password &&
event.request.password &&
uuid
) {
return this.keyringStore
.tryUnlock({
password: request.request.password,
password: event.request.password,
uuid: uuid,
})
.then(() => {
return {
name: request.name,
response: {
unlocked: true,
},
};
})
.catch((e) => {
return {
name: request.name,
error: e,
};
});
.then(() => event.respond({ unlocked: true }))
.catch((e) => event.error(e));
} else if (keyringState === KeyringStoreStateEnum.Unlocked) {
return {
name: request.name,
response: {
unlocked: true,
},
};
return event.respond({ unlocked: true });
}
return {
name: request.name,
response: {
unlocked: false,
},
};
return event.respond({ unlocked: false });
};
}
Loading