UNPKG

@cenoa/waas-js-sdk

Version:

Official Cenoa Wallet as a Service SDK

146 lines (145 loc) 6.52 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const ethers_1 = require("ethers"); const wallet_config_1 = require("./config/wallet.config"); const types_1 = __importDefault(require("./types")); const SigningType = types_1.default.SigningType; function getTypes(signCredential) { if (signCredential.type === SigningType.DEPOSIT) { return wallet_config_1.types.depositTypes; } if (signCredential.type === SigningType.DEPOSIT_V2) { return wallet_config_1.types.depositV2Types; } if (signCredential.type === SigningType.WITHDRAW) { return wallet_config_1.types.withdrawTypes; } if (signCredential.type === SigningType.WITHDRAW_V2) { return wallet_config_1.types.withdrawV2Types; } if (signCredential.type === SigningType.PERMIT) { return wallet_config_1.types.permitTypes; } if (signCredential.type === SigningType.TRANSFER) { return wallet_config_1.types.transferTypes; } if (signCredential.type === SigningType.META_TRANSACTION) { return wallet_config_1.types.metaTransactionTypes; } if (signCredential.type === SigningType.META_TRANSACTION_V2) { return wallet_config_1.types.metaTransactionV2Types; } return wallet_config_1.types.approveTypes; } function getEtherWalletAndDomain(wallet, signCredential) { return __awaiter(this, void 0, void 0, function* () { // create https provider const HTTPSProvider = new ethers_1.ethers.JsonRpcProvider(signCredential.url); // create ether wallet const etherWallet = new ethers_1.ethers.Wallet(wallet.privateKey, HTTPSProvider); const chainId = (yield HTTPSProvider.getNetwork()).chainId; const isPermitType = signCredential.type === SigningType.PERMIT; if (isPermitType) { const fiatToken = new ethers_1.ethers.Contract(signCredential.contractAddress, wallet_config_1.supportedTokenABI, HTTPSProvider); const [name, address] = yield Promise.all([ fiatToken.name(), fiatToken.getAddress(), ]); const domain = { name, version: '2', chainId, verifyingContract: address, }; return { etherWallet, domain }; } const isMetaType = signCredential.type === SigningType.META_TRANSACTION || signCredential.type === SigningType.META_TRANSACTION_V2; if (isMetaType) { const contract = new ethers_1.ethers.Contract(signCredential.contractAddress, wallet_config_1.supportedTokenABI, HTTPSProvider); const [name, address, version] = yield Promise.all([ contract.name(), contract.getAddress(), contract.version().catch(() => '1'), // WORKAROUND: some contracts do not have version getter ]); const domain = { name, version, verifyingContract: address, }; if (signCredential.type === SigningType.META_TRANSACTION) { domain.salt = '0x' + chainId.toString(16).padStart(64, '0'); } else { // META_TRANSACTION_V2 domain.chainId = chainId; } return { etherWallet, domain }; } const diaToken = new ethers_1.ethers.Contract(signCredential.contractAddress, wallet_config_1.diaTokenABI, HTTPSProvider); const [name, version, address] = yield Promise.all([ diaToken.name(), diaToken.version(), diaToken.getAddress(), ]); const domain = { name, version, chainId, verifyingContract: address, }; return { etherWallet, domain }; }); } function signTransaction(wallet, signCredential) { return __awaiter(this, void 0, void 0, function* () { const { etherWallet, domain } = yield getEtherWalletAndDomain(wallet, signCredential); let signature; let types; if (signCredential.type === SigningType.SIGN_HASH) { signature = etherWallet.signingKey.sign(signCredential.payload.hash).serialized; } else { types = getTypes(signCredential); signature = yield etherWallet.signTypedData(domain, types, signCredential.payload); } console.log('[INFO][sign-transaction] signature: ', signature); const splitSignature = ethers_1.ethers.Signature.from(signature); if (types) { const signerAccount = ethers_1.ethers.verifyTypedData(domain, types, signCredential.payload, ethers_1.ethers.Signature.from(splitSignature).serialized); console.log('[INFO][sign-transaction] signer: ', signerAccount); } return { currency: signCredential.currency, contractAddress: signCredential.contractAddress, groupId: signCredential.groupId, paymentOptions: signCredential.paymentOptions, request: Object.assign({ type: signCredential.type }, signCredential.payload), signature: { v: splitSignature.v, r: splitSignature.r, s: splitSignature.s, signature: signature, }, }; }); } var SignManager; (function (SignManager) { SignManager.signTransactions = (wallet, signCredentials) => { return Promise.all(signCredentials.signs.map(signCredential => signTransaction(wallet, signCredential))); }; })(SignManager || (SignManager = {})); exports.default = SignManager;