Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
f117233
Move ENS Resolution to separate file
Montoya Dec 17, 2024
137313b
lint fixes
Montoya Dec 17, 2024
fc075e7
Move send form to separate file
Montoya Dec 17, 2024
7b2cba1
chore: refactor signature types to different components (#380)
pnarayanaswamy Dec 17, 2024
9a87345
Simplify loading a batch of modules
Montoya Dec 17, 2024
99869ee
Use parentContainer pattern across all components
Montoya Dec 17, 2024
623a8a1
Migrate malformed transactions form
Montoya Dec 17, 2024
e449781
Use event listeners for enabling buttons when connected
Montoya Dec 18, 2024
45452f6
Move encrypt-decrypt to separate module
Montoya Dec 18, 2024
65af96a
Migrate encrypt-decrypt and all PPOMs
Montoya Dec 18, 2024
0a83d5e
Fix imports
Montoya Dec 18, 2024
089c21f
fix: permit message verification (#382)
pnarayanaswamy Dec 18, 2024
527956e
chore: Split transactions into separate components (#383)
pnarayanaswamy Dec 18, 2024
05f1b21
Move interactions section to module files
Montoya Dec 18, 2024
3cd4ab6
Move connections to separate files
Montoya Dec 19, 2024
2d31684
Wrap an error message in template string
Montoya Dec 19, 2024
c835453
Migrate type onchange handler to module
Montoya Dec 19, 2024
70df8ab
Move sendDeepLink href set to module
Montoya Dec 19, 2024
9b9cc05
set deep links in erc20 component code
Montoya Dec 19, 2024
37170e0
Fix glaring typo
Montoya Dec 19, 2024
87f3d0c
Programmatic sections
Montoya Dec 19, 2024
7ea98e8
lint fixes
Montoya Dec 19, 2024
8d24355
Move more events and utils
Montoya Dec 19, 2024
5833f15
Lint fix and remove array
Montoya Dec 19, 2024
c5df359
Decentralize clearDisplayElements
Montoya Dec 19, 2024
11dd3f1
No more allConnectedButtons
Montoya Dec 19, 2024
fc91395
Change innerHTML to innerText
Montoya Dec 19, 2024
c0460d8
No more initializeFormElements
Montoya Dec 19, 2024
ccf8120
Move 1559-related DOM updates to separate files
Montoya Dec 20, 2024
a60f48d
Move updating DOM for deployed contract to separate files
Montoya Dec 20, 2024
82a175b
Move updating network specific buttons to separate file
Montoya Dec 20, 2024
0d84c69
Simplify connection event logic
Montoya Dec 20, 2024
3557a7b
Two more custom events
Montoya Dec 20, 2024
d45c665
Fix small error
Montoya Dec 20, 2024
6ea8a5d
Remove unneeded lint disable line
Montoya Dec 20, 2024
b8b2cbb
fix: enable defaults on wallet connect (#384)
pnarayanaswamy Jan 20, 2025
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ node_modules
.vscode
dist
.eslintcache
.DS_Store
73 changes: 73 additions & 0 deletions src/components/connections/connections.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/* import { walletConnect } from "../../connections"; */
import globalContext from '../..';

export function connectionsComponent(parentContainer) {
parentContainer.insertAdjacentHTML(
'beforeend',
`<div class="col-xl-4 col-lg-6 col-md-12 col-sm-12 col-12">
<div class="card">
<div class="card-body">
<h4 class="card-title">
Connect Actions
</h4>

<button
class="btn btn-primary btn-lg btn-block mb-3"
id="connectButton"
disabled
>
Connect
</button>

<button
class="btn btn-primary btn-lg btn-block mb-3"
id="walletConnect"
>
Wallet Connect
</button>
<button
class="btn btn-primary btn-lg btn-block mb-3"
id="sdkConnect"
>
SDK Connect
</button>
<hr />
<button
class="btn btn-primary btn-lg btn-block mb-3"
id="getAccounts"
>
eth_accounts
</button>

<p class="info-text alert alert-secondary">
eth_accounts result: <span id="getAccountsResult"></span>
</p>
</div>
</div>
</div>`,
);

/*
const onboardButton = document.getElementById('connectButton');
const walletConnectBtn = document.getElementById('walletConnect');
const sdkConnectBtn = document.getElementById('sdkConnect');
*/
const getAccounts = document.getElementById('getAccounts');
const getAccountsResult = document.getElementById('getAccountsResult');

document.addEventListener('disableAndClear', function () {
getAccountsResult.innerText = '';
});

getAccounts.onclick = async () => {
try {
const _accounts = await globalContext.provider.request({
method: 'eth_accounts',
});
getAccountsResult.innerHTML = _accounts || 'Not able to get accounts';
} catch (err) {
console.error(err);
getAccountsResult.innerHTML = `Error: ${err.message}`;
}
};
}
2 changes: 2 additions & 0 deletions src/components/connections/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './connections';
export * from './permissions';
94 changes: 94 additions & 0 deletions src/components/connections/permissions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import { getPermissionsDisplayString } from '../../utils';
import globalContext from '../..';

export function permissionsComponent(parentContainer) {
parentContainer.insertAdjacentHTML(
'beforeend',
`<div class="col-xl-4 col-lg-6 col-md-12 col-sm-12 col-12">
<div class="card">
<div class="card-body">
<h4 class="card-title">
Permissions Actions
</h4>

<button
class="btn btn-primary btn-lg btn-block mb-3"
id="requestPermissions"
>
Request Permissions
</button>

<button
class="btn btn-primary btn-lg btn-block mb-3"
id="getPermissions"
>
Get Permissions
</button>
<button
class="btn btn-primary btn-lg btn-block mb-3"
id="revokeAccountsPermission"
>
Revoke Accounts Permission
</button>

<p class="info-text alert alert-secondary">
Permissions result: <span id="permissionsResult"></span>
</p>
</div>
</div>
</div>`,
);

const requestPermissions = document.getElementById('requestPermissions');
const getPermissions = document.getElementById('getPermissions');
const revokeAccountsPermission = document.getElementById(
'revokeAccountsPermission',
);
const permissionsResult = document.getElementById('permissionsResult');

document.addEventListener('disableAndClear', function () {
permissionsResult.innerText = '';
});

requestPermissions.onclick = async () => {
try {
const permissionsArray = await globalContext.provider.request({
method: 'wallet_requestPermissions',
params: [{ eth_accounts: {} }],
});
permissionsResult.innerHTML =
getPermissionsDisplayString(permissionsArray);
} catch (err) {
console.error(err);
permissionsResult.innerHTML = `Error: ${err.message}`;
}
};

getPermissions.onclick = async () => {
try {
const permissionsArray = await globalContext.provider.request({
method: 'wallet_getPermissions',
});
permissionsResult.innerHTML =
getPermissionsDisplayString(permissionsArray);
} catch (err) {
console.error(err);
permissionsResult.innerHTML = `Error: ${err.message}`;
}
};

revokeAccountsPermission.onclick = async () => {
try {
await globalContext.provider.request({
method: 'wallet_revokePermissions',
params: [
{
eth_accounts: {},
},
],
});
} catch (err) {
permissionsResult.innerHTML = `${err.message}`;
}
};
}
156 changes: 156 additions & 0 deletions src/components/encryption/encrypt-decrypt.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
import { encrypt } from '@metamask/eth-sig-util';
import { stringifiableToHex } from '../../utils';
import globalContext from '../..';

export function encryptDecryptComponent(parentContainer) {
parentContainer.insertAdjacentHTML(
'beforeend',
`<div class="row d-flex justify-content-center">
<div class="col-xl-4 col-lg-6 col-md-12 col-sm-12 col-12">
<div class="card">
<div class="card-body">
<h4 class="card-title">
Encrypt / Decrypt
</h4>

<button
class="btn btn-primary btn-lg btn-block mb-3"
id="getEncryptionKeyButton"
disabled
>
Get Encryption Key
</button>

<hr />

<div id="encrypt-message-form">
<input
class="form-control"
type="text"
placeholder="Message to encrypt"
id="encryptMessageInput"
/>

<button
class="btn btn-primary btn-lg btn-block mb-3"
id="encryptButton"
disabled
>
Encrypt
</button>
</div>

<hr />

<button
class="btn btn-primary btn-lg btn-block mb-3"
id="decryptButton"
disabled
>
Decrypt
</button>

<p class="info-text alert alert-secondary">
Encryption key: <span id="encryptionKeyDisplay"></span>
</p>

<p class="info-text text-truncate alert alert-secondary">
Ciphertext: <span id="ciphertextDisplay"></span>
</p>

<p class="info-text alert alert-secondary">
Cleartext: <span id="cleartextDisplay"></span>
</p>
</div>
</div>
</div>
</div>`,
);

const getEncryptionKeyButton = document.getElementById(
'getEncryptionKeyButton',
);
const encryptMessageInput = document.getElementById('encryptMessageInput');
const encryptButton = document.getElementById('encryptButton');
const decryptButton = document.getElementById('decryptButton');
const encryptionKeyDisplay = document.getElementById('encryptionKeyDisplay');
const ciphertextDisplay = document.getElementById('ciphertextDisplay');
const cleartextDisplay = document.getElementById('cleartextDisplay');

document.addEventListener('globalConnectionChange', function (e) {
if (e.detail.connected) {
// MetaMask is connected, enable the button
getEncryptionKeyButton.disabled = false;
}
});

document.addEventListener('disableAndClear', function () {
getEncryptionKeyButton.disabled = true;
encryptMessageInput.disabled = true;
encryptButton.disabled = true;
decryptButton.disabled = true;
encryptionKeyDisplay.innerText = '';
encryptMessageInput.value = '';
ciphertextDisplay.innerText = '';
cleartextDisplay.innerText = '';
});

/**
* Encrypt / Decrypt
*/

getEncryptionKeyButton.onclick = async () => {
try {
encryptionKeyDisplay.innerText = await globalContext.provider.request({
method: 'eth_getEncryptionPublicKey',
params: [globalContext.accounts[0]],
});
encryptMessageInput.disabled = false;
} catch (error) {
encryptionKeyDisplay.innerText = `Error: ${error.message}`;
encryptMessageInput.disabled = true;
encryptButton.disabled = true;
decryptButton.disabled = true;
}
};

encryptMessageInput.onkeyup = () => {
if (
!getEncryptionKeyButton.disabled &&
encryptMessageInput.value.length > 0
) {
if (encryptButton.disabled) {
encryptButton.disabled = false;
}
} else if (!encryptButton.disabled) {
encryptButton.disabled = true;
}
};

encryptButton.onclick = () => {
try {
ciphertextDisplay.innerText = stringifiableToHex(
encrypt({
publicKey: encryptionKeyDisplay.innerText,
data: encryptMessageInput.value,
version: 'x25519-xsalsa20-poly1305',
}),
);
decryptButton.disabled = false;
} catch (error) {
ciphertextDisplay.innerText = `Error: ${error.message}`;
decryptButton.disabled = true;
}
};

decryptButton.onclick = async () => {
try {
cleartextDisplay.innerText = await globalContext.provider.request({
method: 'eth_decrypt',
params: [ciphertextDisplay.innerText, globalContext.accounts[0]],
});
} catch (error) {
cleartextDisplay.innerText = `Error: ${error.message}`;
}
};
}
Loading