@cenoa/waas-js-sdk
Version:
Official Cenoa Wallet as a Service SDK
146 lines (145 loc) • 6.52 kB
JavaScript
;
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;