Commit eaddc9e6 authored by Moody Salem's avatar Moody Salem

dai style permit

parent e83a1ec9
...@@ -39,6 +39,7 @@ const PERMITTABLE_TOKENS: { ...@@ -39,6 +39,7 @@ const PERMITTABLE_TOKENS: {
[UNI[ChainId.MAINNET].address]: { type: PermitType.AMOUNT, name: 'Uniswap' }, [UNI[ChainId.MAINNET].address]: { type: PermitType.AMOUNT, name: 'Uniswap' },
}, },
[ChainId.RINKEBY]: { [ChainId.RINKEBY]: {
['0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735']: { type: PermitType.ALLOWED, name: 'Dai Stablecoin', version: '1' },
[UNI[ChainId.RINKEBY].address]: { type: PermitType.AMOUNT, name: 'Uniswap' }, [UNI[ChainId.RINKEBY].address]: { type: PermitType.AMOUNT, name: 'Uniswap' },
}, },
[ChainId.ROPSTEN]: { [ChainId.ROPSTEN]: {
...@@ -60,19 +61,29 @@ export enum UseERC20PermitState { ...@@ -60,19 +61,29 @@ export enum UseERC20PermitState {
SIGNED, SIGNED,
} }
export interface SignatureData { interface BaseSignatureData {
v: number v: number
r: string r: string
s: string s: string
deadline: number deadline: number
nonce: number nonce: number
amount: string
owner: string owner: string
spender: string spender: string
chainId: ChainId | number chainId: ChainId | number
tokenAddress: string tokenAddress: string
permitType: PermitType
} }
export interface StandardSignatureData extends BaseSignatureData {
amount: string
}
export interface AllowedSignatureData extends BaseSignatureData {
allowed: true
}
export type SignatureData = StandardSignatureData | AllowedSignatureData
const EIP712_DOMAIN_TYPE = [ const EIP712_DOMAIN_TYPE = [
{ name: 'name', type: 'string' }, { name: 'name', type: 'string' },
{ name: 'version', type: 'string' }, { name: 'version', type: 'string' },
...@@ -94,6 +105,14 @@ const EIP2612_TYPE = [ ...@@ -94,6 +105,14 @@ const EIP2612_TYPE = [
{ name: 'deadline', type: 'uint256' }, { name: 'deadline', type: 'uint256' },
] ]
const PERMIT_ALLOWED_TYPE = [
{ name: 'holder', type: 'address' },
{ name: 'spender', type: 'address' },
{ name: 'nonce', type: 'uint256' },
{ name: 'expiry', type: 'uint256' },
{ name: 'allowed', type: 'bool' },
]
export function useERC20Permit( export function useERC20Permit(
currencyAmount: CurrencyAmount | null | undefined, currencyAmount: CurrencyAmount | null | undefined,
spender: string | null | undefined, spender: string | null | undefined,
...@@ -127,9 +146,7 @@ export function useERC20Permit( ...@@ -127,9 +146,7 @@ export function useERC20Permit(
!tokenNonceState.valid || !tokenNonceState.valid ||
!tokenAddress || !tokenAddress ||
!spender || !spender ||
!permitInfo || !permitInfo
// todo: support allowed permit
permitInfo.type !== PermitType.AMOUNT
) { ) {
return { return {
state: UseERC20PermitState.NOT_APPLICABLE, state: UseERC20PermitState.NOT_APPLICABLE,
...@@ -153,17 +170,25 @@ export function useERC20Permit( ...@@ -153,17 +170,25 @@ export function useERC20Permit(
signatureData.deadline >= transactionDeadline.toNumber() && signatureData.deadline >= transactionDeadline.toNumber() &&
signatureData.tokenAddress === tokenAddress && signatureData.tokenAddress === tokenAddress &&
signatureData.spender === spender && signatureData.spender === spender &&
JSBI.equal(JSBI.BigInt(signatureData.amount), currencyAmount.raw) ('allowed' in signatureData || JSBI.equal(JSBI.BigInt(signatureData.amount), currencyAmount.raw))
return { return {
state: isSignatureDataValid ? UseERC20PermitState.SIGNED : UseERC20PermitState.NOT_SIGNED, state: isSignatureDataValid ? UseERC20PermitState.SIGNED : UseERC20PermitState.NOT_SIGNED,
signatureData: isSignatureDataValid ? signatureData : null, signatureData: isSignatureDataValid ? signatureData : null,
gatherPermitSignature: async function gatherPermitSignature() { gatherPermitSignature: async function gatherPermitSignature() {
const allowed = permitInfo.type === PermitType.ALLOWED
const signatureDeadline = transactionDeadline.toNumber() + PERMIT_VALIDITY_BUFFER const signatureDeadline = transactionDeadline.toNumber() + PERMIT_VALIDITY_BUFFER
const value = currencyAmount.raw.toString() const value = currencyAmount.raw.toString()
const message = { const message = allowed
? {
holder: account,
spender,
allowed,
nonce: nonceNumber,
expiry: signatureDeadline,
}
: {
owner: account, owner: account,
spender, spender,
value, value,
...@@ -185,7 +210,7 @@ export function useERC20Permit( ...@@ -185,7 +210,7 @@ export function useERC20Permit(
const data = JSON.stringify({ const data = JSON.stringify({
types: { types: {
EIP712Domain: permitInfo.version ? EIP712_DOMAIN_TYPE : EIP712_DOMAIN_TYPE_NO_VERSION, EIP712Domain: permitInfo.version ? EIP712_DOMAIN_TYPE : EIP712_DOMAIN_TYPE_NO_VERSION,
Permit: EIP2612_TYPE, Permit: allowed ? PERMIT_ALLOWED_TYPE : EIP2612_TYPE,
}, },
domain, domain,
primaryType: 'Permit', primaryType: 'Permit',
...@@ -201,12 +226,13 @@ export function useERC20Permit( ...@@ -201,12 +226,13 @@ export function useERC20Permit(
r: signature.r, r: signature.r,
s: signature.s, s: signature.s,
deadline: signatureDeadline, deadline: signatureDeadline,
amount: value, ...(allowed ? { allowed } : { amount: value }),
nonce: nonceNumber, nonce: nonceNumber,
chainId, chainId,
owner: account, owner: account,
spender, spender,
tokenAddress, tokenAddress,
permitType: permitInfo.type,
}) })
}) })
}, },
......
...@@ -104,7 +104,16 @@ function useSwapCallArguments( ...@@ -104,7 +104,16 @@ function useSwapCallArguments(
deadline: deadline.toString(), deadline: deadline.toString(),
...(signatureData ...(signatureData
? { ? {
inputTokenPermit: { inputTokenPermit:
'allowed' in signatureData
? {
expiry: signatureData.deadline,
nonce: signatureData.nonce,
s: signatureData.s,
r: signatureData.r,
v: signatureData.v as any,
}
: {
deadline: signatureData.deadline, deadline: signatureData.deadline,
amount: signatureData.amount, amount: signatureData.amount,
s: signatureData.s, s: signatureData.s,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment