@dolomite-exchange/dolomite-margin
Version:
Ethereum Smart Contracts and TypeScript library used for the DolomiteMargin trading protocol
95 lines • 4.13 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fixRawSignature = exports.createTypedSignature = exports.ecRecoverTypedSignature = exports.isValidSigType = exports.EIP712_DOMAIN_STRUCT_NO_CONTRACT = exports.EIP712_DOMAIN_STRING_NO_CONTRACT = exports.EIP712_DOMAIN_STRUCT = exports.EIP712_DOMAIN_STRING = exports.PREPEND_HEX = exports.PREPEND_DEC = exports.SIGNATURE_TYPES = void 0;
const ethers_1 = require("ethers");
const web3_1 = __importDefault(require("web3"));
const BytesHelper_1 = require("./BytesHelper");
var SIGNATURE_TYPES;
(function (SIGNATURE_TYPES) {
SIGNATURE_TYPES[SIGNATURE_TYPES["NO_PREPEND"] = 0] = "NO_PREPEND";
SIGNATURE_TYPES[SIGNATURE_TYPES["DECIMAL"] = 1] = "DECIMAL";
SIGNATURE_TYPES[SIGNATURE_TYPES["HEXADECIMAL"] = 2] = "HEXADECIMAL";
})(SIGNATURE_TYPES = exports.SIGNATURE_TYPES || (exports.SIGNATURE_TYPES = {}));
exports.PREPEND_DEC = '\x19Ethereum Signed Message:\n32';
exports.PREPEND_HEX = '\x19Ethereum Signed Message:\n\x20';
exports.EIP712_DOMAIN_STRING = 'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)';
exports.EIP712_DOMAIN_STRUCT = [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' },
];
exports.EIP712_DOMAIN_STRING_NO_CONTRACT = 'EIP712Domain(string name,string version,uint256 chainId)';
exports.EIP712_DOMAIN_STRUCT_NO_CONTRACT = [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
];
function isValidSigType(sigType) {
switch (sigType) {
case SIGNATURE_TYPES.NO_PREPEND:
case SIGNATURE_TYPES.DECIMAL:
case SIGNATURE_TYPES.HEXADECIMAL:
return true;
default:
return false;
}
}
exports.isValidSigType = isValidSigType;
function ecRecoverTypedSignature(hash, typedSignature) {
if (BytesHelper_1.stripHexPrefix(typedSignature).length !== 66 * 2) {
throw new Error(`Unable to ecrecover signature: ${typedSignature}`);
}
const sigType = parseInt(typedSignature.slice(-2), 16);
let prependedHash;
switch (sigType) {
case SIGNATURE_TYPES.NO_PREPEND:
prependedHash = hash;
break;
case SIGNATURE_TYPES.DECIMAL:
prependedHash = web3_1.default.utils.soliditySha3({ t: 'string', v: exports.PREPEND_DEC }, { t: 'bytes32', v: hash });
break;
case SIGNATURE_TYPES.HEXADECIMAL:
prependedHash = web3_1.default.utils.soliditySha3({ t: 'string', v: exports.PREPEND_HEX }, { t: 'bytes32', v: hash });
break;
default:
throw new Error(`Invalid signature type: ${sigType}`);
}
const signature = typedSignature.slice(0, -2);
return ethers_1.ethers.utils.recoverAddress(ethers_1.ethers.utils.arrayify(prependedHash), signature);
}
exports.ecRecoverTypedSignature = ecRecoverTypedSignature;
function createTypedSignature(signature, sigType) {
if (!isValidSigType(sigType)) {
throw new Error(`Invalid signature type: ${sigType}`);
}
return `${fixRawSignature(signature)}0${sigType}`;
}
exports.createTypedSignature = createTypedSignature;
/**
* Fixes any signatures that don't have a 'v' value of 27 or 28
*/
function fixRawSignature(signature) {
const stripped = BytesHelper_1.stripHexPrefix(signature);
if (stripped.length !== 130) {
throw new Error(`Invalid raw signature: ${signature}`);
}
const rs = stripped.substr(0, 128);
const v = stripped.substr(128, 2);
switch (v) {
case '00':
return `0x${rs}1b`;
case '01':
return `0x${rs}1c`;
case '1b':
case '1c':
return `0x${stripped}`;
default:
throw new Error(`Invalid v value: ${v}`);
}
}
exports.fixRawSignature = fixRawSignature;
//# sourceMappingURL=SignatureHelper.js.map