UNPKG

@openocean.finance/widget-sdk

Version:

OpenOcean Any-to-Any Cross-Chain-Swap SDK

115 lines 4.42 kB
import { hashTypedData } from 'viem'; import { invariant } from '../../../utils/invariant.js'; import { MaxSigDeadline, MaxSignatureTransferAmount, MaxUnorderedNonce, } from './constants.js'; import { permit2Domain } from './domain.js'; const TOKEN_PERMISSIONS = [ { name: 'token', type: 'address' }, { name: 'amount', type: 'uint256' }, ]; const PERMIT_TRANSFER_FROM_TYPES = { TokenPermissions: TOKEN_PERMISSIONS, PermitTransferFrom: [ { name: 'permitted', type: 'TokenPermissions' }, { name: 'spender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'deadline', type: 'uint256' }, ], }; const PERMIT_BATCH_TRANSFER_FROM_TYPES = { TokenPermissions: TOKEN_PERMISSIONS, PermitBatchTransferFrom: [ { name: 'permitted', type: 'TokenPermissions[]' }, { name: 'spender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'deadline', type: 'uint256' }, ], }; function isPermitTransferFrom(permit) { return !Array.isArray(permit.permitted); } export function getPermitTransferData(permit, permit2Address, chainId, witness) { invariant(MaxSigDeadline >= permit.deadline, 'SIG_DEADLINE_OUT_OF_RANGE'); invariant(MaxUnorderedNonce >= permit.nonce, 'NONCE_OUT_OF_RANGE'); const domain = permit2Domain(permit2Address, chainId); validateTokenPermissions(permit.permitted); const types = witness ? { TokenPermissions: TOKEN_PERMISSIONS, ...witness.witnessType, PermitWitnessTransferFrom: [ { name: 'permitted', type: 'TokenPermissions' }, { name: 'spender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'deadline', type: 'uint256' }, { name: 'witness', type: witness.witnessTypeName }, ], } : PERMIT_TRANSFER_FROM_TYPES; const message = witness ? Object.assign(permit, { witness: witness.witness }) : permit; return { domain, types, message, }; } export function getPermitBatchTransferData(permit, permit2Address, chainId, witness) { invariant(MaxSigDeadline >= permit.deadline, 'SIG_DEADLINE_OUT_OF_RANGE'); invariant(MaxUnorderedNonce >= permit.nonce, 'NONCE_OUT_OF_RANGE'); const domain = permit2Domain(permit2Address, chainId); permit.permitted.forEach(validateTokenPermissions); const types = witness ? { ...witness.witnessType, TokenPermissions: TOKEN_PERMISSIONS, PermitBatchWitnessTransferFrom: [ { name: 'permitted', type: 'TokenPermissions[]' }, { name: 'spender', type: 'address' }, { name: 'nonce', type: 'uint256' }, { name: 'deadline', type: 'uint256' }, { name: 'witness', type: witness.witnessTypeName }, ], } : PERMIT_BATCH_TRANSFER_FROM_TYPES; const message = witness ? Object.assign(permit, { witness: witness.witness }) : permit; return { domain, types, message, }; } export function getPermitData(permit, permit2Address, chainId, witness) { if (isPermitTransferFrom(permit)) { return getPermitTransferData(permit, permit2Address, chainId, witness); } return getPermitBatchTransferData(permit, permit2Address, chainId, witness); } export function hash(permit, permit2Address, chainId, witness) { if (isPermitTransferFrom(permit)) { const { domain, types, message } = getPermitTransferData(permit, permit2Address, chainId, witness); return hashTypedData({ domain, types, primaryType: witness ? 'PermitWitnessTransferFrom' : 'PermitTransferFrom', message: { ...message, }, }); } const { domain, types, message } = getPermitBatchTransferData(permit, permit2Address, chainId, witness); return hashTypedData({ domain, types, primaryType: witness ? 'PermitBatchWitnessTransferFrom' : 'PermitBatchTransferFrom', message: { ...message }, }); } function validateTokenPermissions(permissions) { invariant(MaxSignatureTransferAmount >= permissions.amount, 'AMOUNT_OUT_OF_RANGE'); } //# sourceMappingURL=signatureTransfer.js.map