Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion wallet-extension/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ bs58 = { version = "0.5.1", default-features = false }
console_error_panic_hook = "0.1.7"
getrandom = { version = "0.3.3", features = ["wasm_js"] }
thiserror = "2.0.16"
wallet-standard-base = { version = "0.1.4", features = ["getrandom"] }
wallet-standard-base = { version = "0.1.7", features = ["getrandom"] }
bincode = "1"
solana-keypair = { version = "2", default-features = false, features = [
"seed-derivable",
Expand Down Expand Up @@ -42,3 +42,4 @@ web-sys = { workspace = true, features = [
] }
zeroize = "1.8.1"
blake3 = { version = "1.8.2", default-features = false }
humantime = "2.2.0"
34 changes: 0 additions & 34 deletions wallet-extension/extension/js/background.js
Original file line number Diff line number Diff line change
@@ -1,37 +1,3 @@
// const walletAccount = {
// address: "BtRL4ydcfGzRRZBUosHh6aQBg9DzLdNN6Nybhce6fqF3",
// publicKey: new Uint8Array([
// 161, 192, 255, 200, 114, 43, 197, 135, 210, 81, 184, 46, 253, 220, 248, 75,
// 127, 99, 22, 137, 190, 13, 51, 164, 25, 226, 205, 215, 91, 235, 218, 14,
// ]),
// chains: ["solana:mainnet", "solana:devnet", "solana:testnet"],
// features: [
// "standard:connect",
// "standard:disconnect",
// "standard:events",
// "solana:signIn",
// "solana:signAndSendTransaction",
// "solana:signTransaction",
// "solana:signMessage",
// ],
// icon: undefined,
// label: undefined,
// };

// (async () => {
// const extension = typeof browser !== "undefined" ? browser : chrome;

// extension.runtime.onMessage.addListener((message, sender, sendResponse) => {
// console.log("Got message in background:", message);

// setTimeout(() => {
// sendResponse(walletAccount);
// }, 500);

// return true; // required since response is async
// });
// })();

(async () => {
const extension = typeof browser !== "undefined" ? browser : chrome;

Expand Down
57 changes: 49 additions & 8 deletions wallet-extension/extension/js/content.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,16 @@
const STANDARD_CONNECT = "standard:connect";
const RELAY_STANDARD_CONNECT = "relay:standard:connect";

const RELAY_SOLANA_SIGN_IN = "relay:solana:signIn";
const SOLANA_SIGN_IN = "solana:signIn";

function injectPageWallet(walletInfo) {
const STANDARD_CONNECT = "standard:connect";
const RELAY_STANDARD_CONNECT = "relay:standard:connect";

const RELAY_SOLANA_SIGN_IN = "relay:solana:signIn";
const SOLANA_SIGN_IN = "solana:signIn";

const WALLET_REGISTER_EVENT = "wallet-standard:register-wallet";
const APP_READY_EVENT = "wallet-standard:app-ready";

Expand Down Expand Up @@ -170,14 +176,26 @@
];
};
#signIn = async (...inputs) => {
console.log("SIGN IN", ...inputs);
return [
{
account: walletAccount,
signedMessage: new Uint8Array([13, 14, 15]),
signature: new Uint8Array([16, 17, 18]),
},
];
const result = await new Promise((resolve, reject) => {
const listener = (event) => {
if (event.source !== window) return;
if (event.data.type === RELAY_SOLANA_SIGN_IN) {
window.removeEventListener("message", listener);

if (event.data.failure) reject(new Error(event.data.failure));
else resolve(event.data.success);
}
};
window.addEventListener("message", listener);

// Send request → content.js
window.postMessage(
{ type: SOLANA_SIGN_IN, requestData: inputs[0], text: "" },
"*"
);
});

return result;
};
}

Expand Down Expand Up @@ -222,4 +240,27 @@
);
}
});

window.addEventListener("message", (event) => {
console.log("SignIn event:", event);

if (event.source !== window) return;
if (event.data.type === SOLANA_SIGN_IN) {
extension.runtime.sendMessage(
{ resource: event.data.type, data: event.data },
(response) => {
console.log("Content script got response from background:", response);
// Relay back under RELAY_STANDARD_CONNECT
window.postMessage(
{
type: RELAY_SOLANA_SIGN_IN,
success: response.success,
failure: response.failure,
},
"*"
);
}
);
}
});
})();
4 changes: 4 additions & 0 deletions wallet-extension/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ pub enum AtollWalletError {
ExtensionRuntimeMessageAddListenerIsMissing,
#[error("{0}")]
JsCast(String),
#[error("{0}")]
Input(String),
#[error("The message `{0}` from `extension.runtime.onMessage.addListener` is not supported")]
UnsupportedExtensionMessage(String),
#[error(
Expand All @@ -35,6 +37,8 @@ pub enum AtollWalletError {
UnableToRecoverSolanaKeypairFromMnemonic,
#[error("A request was made to authorize a dapp but a keypair doesn't exist yet")]
UnauthorizedKeypairRequest,
#[error("The `{0}` timestamp is not a valid ISO8601 timestamp.")]
InvalidIS08601Timestamp(String),
}

#[derive(Debug, PartialEq)]
Expand Down
25 changes: 24 additions & 1 deletion wallet-extension/src/impl_solana/clusters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ impl Cluster for SolanaCluster {
fn endpoint(&self) -> &str {
match self {
Self::Mainnet => SolanaConstants::MAINNET_ENDPOINT,
Self::Testnet => SolanaConstants::TESTNET_IDENTIFIER,
Self::Testnet => SolanaConstants::TESTNET_ENDPOINT,
Self::Devnet => SolanaConstants::DEVNET_ENDPOINT,
Self::Localnet => SolanaConstants::LOCALNET_ENDPOINT,
}
Expand All @@ -52,3 +52,26 @@ impl Cluster for SolanaCluster {
]
}
}

impl From<&str> for SolanaCluster {
fn from(value: &str) -> Self {
match value {
SolanaConstants::MAINNET_IDENTIFIER => Self::Mainnet,
SolanaConstants::TESTNET_IDENTIFIER => Self::Testnet,
SolanaConstants::DEVNET_IDENTIFIER => Self::Devnet,
SolanaConstants::LOCALNET_IDENTIFIER => Self::Localnet,

SolanaConstants::MAINNET_CHAIN => Self::Mainnet,
SolanaConstants::TESTNET_CHAIN => Self::Testnet,
SolanaConstants::DEVNET_CHAIN => Self::Devnet,
SolanaConstants::LOCALNET_CHAIN => Self::Localnet,

SolanaConstants::MAINNET_ENDPOINT => Self::Mainnet,
SolanaConstants::TESTNET_ENDPOINT => Self::Testnet,
SolanaConstants::DEVNET_ENDPOINT => Self::Devnet,
SolanaConstants::LOCALNET_ENDPOINT => Self::Localnet,

_ => Self::Devnet,
}
}
}
1 change: 1 addition & 0 deletions wallet-extension/src/impl_solana/interface/mod.rs
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
mod sign_in;
mod standard_connect;
Loading
Loading