Skip to content
This repository has been archived by the owner on Mar 16, 2023. It is now read-only.

Commit

Permalink
feat(sdk): update the sdk to detect permit from config
Browse files Browse the repository at this point in the history
  • Loading branch information
joeandrews committed Feb 24, 2020
1 parent 7e84f74 commit 3715c38
Show file tree
Hide file tree
Showing 7 changed files with 154 additions and 1 deletion.
32 changes: 32 additions & 0 deletions packages/extension/src/client/services/MetaMaskService/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import * as ethUtil from 'ethereumjs-util';
import Web3Service from '~/client/services/Web3Service';
import registerExtension, { generateTypedData } from './registerExtension';
import signNote from './signNote';
import permitSchema from './permitSchema';
import signProof from './signProof';

const handleAction = async (action, params) => {
Expand Down Expand Up @@ -100,6 +101,37 @@ const handleAction = async (action, params) => {
};

break;
}
case 'metamask.eip712.permit': {
const {
allowed,
exipiry,
nonce,
spender,
verifyingContract,
} = params;

const permitSchema = permit({
allowed,
exipiry,
nonce,
spender,
verifyingContract
});
const method = 'eth_signTypedData_v4';
const { result } = await Web3Service.sendAsync({
method,
params: [address, permitSchema],
from: address,
});

response = {
signature: result,
};

break;
}
default:
}
default:
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { signer } from 'aztec.js';
import utils from '@aztec/dev-utils';

const {
constants: {
eip712,
},
} = utils;


export default ({
spender,
verifyingContract,
allowed,
expiry,
spender,
nonce
}) => {
const domain = signer.generateDAIDomainparams(chainId, verifyingContract);
const schema = eip712.PERMIT_SIGNATURE;

const message = {
allowed,
spender,
expiry,
nonce,
};

const data = JSON.stringify({
...schema,
message,
domain,
});

return data;
};
3 changes: 3 additions & 0 deletions packages/extension/src/config/supportsPermitSignature.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default {
'0x6b175474e89094c44da98b954eedeac495271d0f': true,
};
54 changes: 54 additions & 0 deletions packages/extension/src/ui/apis/asset/permitERC20Allowance.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import ConnectionService from '~/ui/services/ConnectionService';
import Web3Service from '~/helpers/Web3Service';

export default async function permitERC20({
asset,
requestedAllowance,
allowanceSpender,
}) {


const {
linkedTokenAddress,
} = asset;

let error;
try {
const nonce = await Web3Service
.useContract('ERC20')
.at(linkedTokenAddress)
.method('nonces')
.send(
allowanceSpender,
);
} catch (e) {
error = e;
}
const exipry = Date.now() + 24 * 60 * 60;
const {
signature,
error,
} = await ConnectionService.post({
action: 'metamask.eip712.permit',
data: {
nonce,
expiry,
allowed: requestedAllowance
spender: allowanceSpender,
},
});

if (error) {
return {
error,
};
}

return {
spender: sender,
nonce,
expiry,
allowed; requestedAllowance,
signature,
};
}
7 changes: 6 additions & 1 deletion packages/extension/src/ui/pages/Deposit.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ const Deposit = ({
steps = depositSteps.gsnTransfer;
}

const tokenSupportsPermit = getTokenPermitStatus(asset.linkedTokenAddress);
if (tokenSupportsPermit) {
steps = depositSteps.gsnWithPermit;
}

const allowance = await Web3Service
.useContract('ERC20')
.at(asset.linkedTokenAddress)
Expand All @@ -65,7 +70,7 @@ const Deposit = ({
const erc20Amount = asset.scalingFactor.mul(new BN(amount));
const requestedAllowance = erc20Amount;
if (approvedERC20Allowance.gte(requestedAllowance)) {
steps = steps.filter(({ name }) => name !== 'approveERC20');
steps = steps.filter(({ name }) => name !== 'approveERC20' || 'permitERC20');
}

return {
Expand Down
20 changes: 20 additions & 0 deletions packages/extension/src/ui/steps/deposit.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,20 @@ const stepApproveERC20 = {
submitTextKey: 'transaction.approve.submit',
};


const stepPermitERC20 = {
name: 'permitERC20',
descriptionKey: 'deposit.approve.description',
blockStyle: 'linked',
tasks: [
{
type: 'sign',
run: apis.asset.permitERC20Allowance,
},
],
submitTextKey: 'transaction.approve.submit',
};

const stepConfirm = {
name: 'confirmTransaction',
descriptionKey: 'deposit.send.description',
Expand Down Expand Up @@ -121,6 +135,12 @@ export default {
stepConfirmForGSN,
stepTransferViaGSN,
],
gsnWithPermit: [
stepPermitERC20,
stepConfirmForGSN,
stepSendViaGSN,
],

metamask: [
stepApproveERC20,
stepConfirm,
Expand Down
3 changes: 3 additions & 0 deletions packages/extension/src/ui/utils/makeToken.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import {
getResourceUrl,
} from '~/utils/versionControl';

import supportsPermit from '~/config/supportsPermitSignature';

const publicResourcePath = getResourceUrl('public');

const formatIconUrl = (icon) => {
Expand All @@ -24,5 +26,6 @@ export default function makeToken(address) {
symbol,
decimals,
icon: formatIconUrl(logo),
supportsPermit: supportsPermit[address],
};
}

0 comments on commit 3715c38

Please sign in to comment.