Skip to content

Commit 15cb01a

Browse files
authored
feat: Add SignTypedData primaryType variants: Blur - Order, PermitBatch, PermitSingle, Seaport - BulkOrder (#376)
* feat: add PermitSingle and PermitBatch buttons * feat: add Blur - Order and Seaport - BulkOrder buttons * build: update eslint files: ['src/**/*.js'], * refactor: reorder mock request lines * refactor: DRY signTypedData variant logic * fix: Blur order Permit type spec
1 parent 1fe6c49 commit 15cb01a

File tree

4 files changed

+601
-46
lines changed

4 files changed

+601
-46
lines changed

.eslintrc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module.exports = {
1717

1818
overrides: [
1919
{
20-
files: ['src/*.js'],
20+
files: ['src/**/*.js'],
2121
parserOptions: {
2222
sourceType: 'module',
2323
},

src/index.html

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,6 +1334,57 @@ <h4>
13341334
</div>
13351335
</div>
13361336
</div>
1337+
1338+
<div
1339+
class="col-xl-4 col-lg-6 col-md-12 col-sm-12 col-12 d-flex align-items-stretch"
1340+
>
1341+
<div class="card full-width">
1342+
<div class="card-body">
1343+
<h4>
1344+
Sign Typed Data Variants
1345+
</h4>
1346+
<button
1347+
class="btn btn-primary btn-lg btn-block mb-3"
1348+
id="signBlurOrder"
1349+
disabled
1350+
>
1351+
Blur - Order
1352+
</button>
1353+
<button
1354+
class="btn btn-primary btn-lg btn-block mb-3"
1355+
id="signPermitSingle"
1356+
disabled
1357+
>
1358+
PermitSingle
1359+
</button>
1360+
1361+
<button
1362+
class="btn btn-primary btn-lg btn-block mb-3"
1363+
id="signPermitBatch"
1364+
disabled
1365+
>
1366+
PermitBatch
1367+
</button>
1368+
1369+
<button
1370+
class="btn btn-primary btn-lg btn-block mb-3"
1371+
id="signSeaportBulkOrder"
1372+
disabled
1373+
>
1374+
Seaport - BulkOrder
1375+
</button>
1376+
1377+
<p class="info-text alert alert-warning">
1378+
Result:
1379+
<span id="signPermitVariantResult"></span>
1380+
<p class="info-text alert alert-warning" id="signPermitVariantResultR">r: </p>
1381+
<p class="info-text alert alert-warning" id="signPermitVariantResultS">s: </p>
1382+
<p class="info-text alert alert-warning" id="signPermitVariantResultV">v: </p>
1383+
</p>
1384+
</div>
1385+
</div>
1386+
</div>
1387+
13371388
<div
13381389
class="col-xl-4 col-lg-6 col-md-12 col-sm-12 col-12 d-flex align-items-stretch"
13391390
>

src/index.js

Lines changed: 96 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ import {
1313
walletConnect,
1414
} from './connections';
1515
import Constants from './constants.json';
16+
import {
17+
EIP712Domain,
18+
getPermitMsgParams,
19+
MSG_PRIMARY_TYPE,
20+
} from './signatures/utils';
1621
import {
1722
ERC20_SAMPLE_CONTRACTS,
1823
ERC721_SAMPLE_CONTRACTS,
@@ -259,6 +264,27 @@ const signPermitVerify = document.getElementById('signPermitVerify');
259264
const signPermitVerifyResult = document.getElementById(
260265
'signPermitVerifyResult',
261266
);
267+
268+
// Sign Typed Data Variants
269+
270+
const signBlurOrder = document.getElementById('signBlurOrder');
271+
const signPermitSingle = document.getElementById('signPermitSingle');
272+
const signPermitBatch = document.getElementById('signPermitBatch');
273+
const signSeaportBulkOrder = document.getElementById('signSeaportBulkOrder');
274+
275+
const signPermitVariantResult = document.getElementById(
276+
'signPermitVariantResult',
277+
);
278+
const signPermitVariantResultR = document.getElementById(
279+
'signPermitVariantResultR',
280+
);
281+
const signPermitVariantResultS = document.getElementById(
282+
'signPermitVariantResultS',
283+
);
284+
const signPermitVariantResultV = document.getElementById(
285+
'signPermitVariantResultV',
286+
);
287+
262288
const siwe = document.getElementById('siwe');
263289
const siweResources = document.getElementById('siweResources');
264290
const siweBadDomain = document.getElementById('siweBadDomain');
@@ -442,8 +468,12 @@ const allConnectedButtons = [
442468
signTypedDataV4Verify,
443469
signTypedDataV4Batch,
444470
signTypedDataV4Queue,
471+
signBlurOrder,
445472
signPermit,
473+
signPermitSingle,
474+
signPermitBatch,
446475
signPermitVerify,
476+
signSeaportBulkOrder,
447477
siwe,
448478
siweResources,
449479
siweBadDomain,
@@ -498,7 +528,11 @@ const initialConnectedButtons = [
498528
signTypedDataV4,
499529
signTypedDataV4Batch,
500530
signTypedDataV4Queue,
531+
signBlurOrder,
501532
signPermit,
533+
signPermitSingle,
534+
signPermitBatch,
535+
signSeaportBulkOrder,
502536
siwe,
503537
siweResources,
504538
siweBadDomain,
@@ -2696,49 +2730,6 @@ const initializeFormElements = () => {
26962730
/**
26972731
* Sign Permit
26982732
*/
2699-
const EIP712Domain = [
2700-
{ name: 'name', type: 'string' },
2701-
{ name: 'version', type: 'string' },
2702-
{ name: 'chainId', type: 'uint256' },
2703-
{ name: 'verifyingContract', type: 'address' },
2704-
];
2705-
2706-
const Permit = [
2707-
{ name: 'owner', type: 'address' },
2708-
{ name: 'spender', type: 'address' },
2709-
{ name: 'value', type: 'uint256' },
2710-
{ name: 'nonce', type: 'uint256' },
2711-
{ name: 'deadline', type: 'uint256' },
2712-
];
2713-
2714-
const permitMsgParamsDomain = {
2715-
name: 'MyToken',
2716-
version: '1',
2717-
verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
2718-
chainId: chainIdInt,
2719-
};
2720-
2721-
function getPermitMsgParams() {
2722-
const from = accounts[0];
2723-
2724-
const permit = {
2725-
owner: from,
2726-
spender: '0x5B38Da6a701c568545dCfcB03FcB875f56beddC4',
2727-
value: 3000,
2728-
nonce: 0,
2729-
deadline: 50000000000,
2730-
};
2731-
2732-
return {
2733-
types: {
2734-
EIP712Domain,
2735-
Permit,
2736-
},
2737-
primaryType: 'Permit',
2738-
domain: permitMsgParamsDomain,
2739-
message: permit,
2740-
};
2741-
}
27422733

27432734
async function getNFTMsgParams() {
27442735
return {
@@ -2780,7 +2771,13 @@ const initializeFormElements = () => {
27802771

27812772
signPermit.onclick = async () => {
27822773
const from = accounts[0];
2783-
const msgParams = getPermitMsgParams();
2774+
const msgParams = getPermitMsgParams(
2775+
{
2776+
primaryType: MSG_PRIMARY_TYPE.PERMIT,
2777+
chainId: chainIdInt,
2778+
},
2779+
{ fromAddress: from },
2780+
);
27842781

27852782
let sign;
27862783
let r;
@@ -2792,6 +2789,7 @@ const initializeFormElements = () => {
27922789
method: 'eth_signTypedData_v4',
27932790
params: [from, JSON.stringify(msgParams)],
27942791
});
2792+
27952793
const { _r, _s, _v } = splitSig(sign);
27962794
r = `0x${_r.toString('hex')}`;
27972795
s = `0x${_s.toString('hex')}`;
@@ -2808,12 +2806,65 @@ const initializeFormElements = () => {
28082806
}
28092807
};
28102808

2809+
async function requestSignTypedDataVariant(primaryType) {
2810+
const from = accounts[0];
2811+
const msgParams = getPermitMsgParams(
2812+
{
2813+
primaryType,
2814+
chainId: chainIdInt,
2815+
},
2816+
{ fromAddress: from },
2817+
);
2818+
2819+
let sign;
2820+
let r;
2821+
let s;
2822+
let v;
2823+
2824+
try {
2825+
sign = await provider.request({
2826+
method: 'eth_signTypedData_v4',
2827+
params: [from, JSON.stringify(msgParams)],
2828+
});
2829+
2830+
const { _r, _s, _v } = splitSig(sign);
2831+
r = `0x${_r.toString('hex')}`;
2832+
s = `0x${_s.toString('hex')}`;
2833+
v = _v.toString();
2834+
2835+
signPermitVariantResult.innerHTML = sign;
2836+
signPermitVariantResultR.innerHTML = `r: ${r}`;
2837+
signPermitVariantResultS.innerHTML = `s: ${s}`;
2838+
signPermitVariantResultV.innerHTML = `v: ${v}`;
2839+
signPermitVerify.disabled = false;
2840+
} catch (err) {
2841+
console.error(err);
2842+
signPermitVariantResult.innerHTML = `Error: ${err.message}`;
2843+
}
2844+
}
2845+
2846+
signBlurOrder.onclick = async () => {
2847+
await requestSignTypedDataVariant(MSG_PRIMARY_TYPE.BLUR_ORDER);
2848+
};
2849+
signPermitBatch.onclick = async () => {
2850+
await requestSignTypedDataVariant(MSG_PRIMARY_TYPE.PERMIT_BATCH);
2851+
};
2852+
signPermitSingle.onclick = async () => {
2853+
await requestSignTypedDataVariant(MSG_PRIMARY_TYPE.PERMIT_SINGLE);
2854+
};
2855+
signSeaportBulkOrder.onclick = async () => {
2856+
await requestSignTypedDataVariant(MSG_PRIMARY_TYPE.SEAPORT_BULK_ORDER);
2857+
};
2858+
28112859
/**
28122860
* Sign Permit Verification
28132861
*/
28142862
signPermitVerify.onclick = async () => {
28152863
const from = accounts[0];
2816-
const msgParams = getPermitMsgParams();
2864+
const msgParams = getPermitMsgParams({
2865+
primaryType: MSG_PRIMARY_TYPE.PERMIT,
2866+
chainId: chainIdInt,
2867+
});
28172868

28182869
try {
28192870
const sign = signPermitResult.innerHTML;

0 commit comments

Comments
 (0)