picasso-sdk
Version:
Picasso sdk for cosmos, ethereum, solana, and polkadot ibc transfer
406 lines (405 loc) • 25.7 kB
JavaScript
"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 __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.polkadotTransfer = exports.buildStatusInfo = void 0;
exports.transferXcm = transferXcm;
exports.transferIbc = transferIbc;
var util_crypto_1 = require("@polkadot/util-crypto");
var type_builder_1 = require("./type-builder");
var helper_1 = require("./helper");
var config_1 = require("../../config");
var common_1 = require("../common");
function signAndSendTransfer(_a) {
return __awaiter(this, arguments, void 0, function (_b) {
var _c, account, signerOption;
var _this = this;
var api = _b.api, apiTo = _b.apiTo, fromAddress = _b.fromAddress, toAddress = _b.toAddress, extrinsic = _b.extrinsic, isIbc = _b.isIbc, filter = _b.filter, signer = _b.signer;
return __generator(this, function (_d) {
switch (_d.label) {
case 0: return [4, (0, helper_1.getSignAndSendParams)(fromAddress, signer)];
case 1:
_c = _d.sent(), account = _c.account, signerOption = _c.signerOption;
return [2, new Promise(function (resolve, reject) {
var state = { isFailedTxShown: false };
console.log('step0', extrinsic);
extrinsic
.signAndSend(account, signerOption, function (result) { return __awaiter(_this, void 0, void 0, function () {
var dispatchError, status, events, _a, txHash, sequence, errorMessage, decoded, docs, name_1, section, errorResult, found, header, _b, result_1, found_1, result_2, header, _c, result_3;
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
console.log('step1', result);
dispatchError = result.dispatchError, status = result.status, events = result.events;
_a = (0, exports.buildStatusInfo)(result.txHash.toString(), JSON.parse(JSON.stringify(events))), txHash = _a.txHash, sequence = _a.sequence;
console.log('step2', events, txHash, sequence);
if (dispatchError) {
errorMessage = void 0;
if (dispatchError.isModule) {
decoded = api.registry.findMetaError(dispatchError.asModule);
docs = decoded.docs, name_1 = decoded.name, section = decoded.section;
errorMessage = "".concat(section, ".").concat(name_1, ": ").concat(docs.join(' '));
}
else {
errorMessage = dispatchError.toString();
}
if ((result === null || result === void 0 ? void 0 : result.txHash) && !state.isFailedTxShown) {
state.isFailedTxShown = true;
}
errorResult = {
destAddress: toAddress,
txHash: txHash,
sequence: sequence,
status: 'error',
currentHopIndex: 0,
message: errorMessage,
};
return [2, reject(errorResult)];
}
console.log('step3', events);
found = JSON.parse(JSON.stringify(events)).find(function (e) { var _a, _b; return (_b = (_a = e.event) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.find(function (data) { var _a; return ((_a = data['incomplete']) === null || _a === void 0 ? void 0 : _a.length) > 0; }); });
console.log('step4', found);
if (found) {
return [2, reject({
destAddress: toAddress,
txHash: txHash,
sequence: sequence,
status: 'error',
message: 'Transfer incomplete',
})];
}
if (!status) return [3, 9];
console.log('step5', status);
if (!isIbc) return [3, 4];
console.log('step5.5');
if (!apiTo) return [3, 2];
return [4, apiTo.rpc.chain.getHeader()];
case 1:
_b = _d.sent();
return [3, 3];
case 2:
_b = null;
_d.label = 3;
case 3:
header = _b;
result_1 = {
destAddress: toAddress,
txHash: txHash,
sequence: sequence,
currentHopIndex: 0,
status: 'pending',
latestBlockNumber: header ? header.number.toNumber() : -1,
};
return [2, resolve(result_1)];
case 4:
if (!filter) return [3, 5];
console.log('step6');
found_1 = events.find(function (e) { return filter(e.event); });
if (!found_1 && !state.isFailedTxShown) {
state.isFailedTxShown = true;
return [2, reject({
destAddress: toAddress,
txHash: txHash,
sequence: sequence,
status: 'error',
})];
}
if (found_1 && found_1.event.data.find(function (x) { return x['isComplete']; })) {
console.log('step6.5');
result_2 = {
destAddress: toAddress,
txHash: txHash,
sequence: sequence,
currentHopIndex: 0,
status: 'success',
};
return [2, resolve(result_2)];
}
return [3, 9];
case 5:
console.log('step7');
if (!apiTo) return [3, 7];
return [4, apiTo.rpc.chain.getHeader()];
case 6:
_c = _d.sent();
return [3, 8];
case 7:
_c = null;
_d.label = 8;
case 8:
header = _c;
result_3 = {
destAddress: toAddress,
txHash: txHash,
sequence: sequence,
status: 'success',
currentHopIndex: 0,
latestBlockNumber: header ? header.number.toNumber() : -1,
};
return [2, resolve(result_3)];
case 9: return [2];
}
});
}); })
.catch(function (e) {
console.error('errorSDKSignAndSend', e);
return reject({
fromAddress: fromAddress,
destAddress: toAddress,
txHash: 'NONE',
sequence: 'NONE',
status: 'error',
errorMessage: e.toString(),
});
});
})];
}
});
});
}
var buildStatusInfo = function (txHash, events) {
console.log('buildStatusInfo', events);
if (!events)
return { txHash: txHash, sequence: 'NONE' };
var packet = events
.filter(function (d) { return d.event && d.event.data && typeof d.event.data[0] !== 'string'; })
.reduce(function (a, e) { return a.concat(e.event.data[0]); }, []);
for (var i = 0; i < packet.length; i++) {
if (packet[i].ok &&
packet[i].ok.sendPacket &&
packet[i].ok.sendPacket.sequence) {
var sequence = packet[i].ok.sendPacket.sequence;
return { txHash: txHash, sequence: sequence };
}
}
return { txHash: txHash, sequence: 'NONE' };
};
exports.buildStatusInfo = buildStatusInfo;
function transferXcm(_a) {
return __awaiter(this, arguments, void 0, function (_b) {
var _c, fromSs58Format, isFromParachain, _d, toSs58Format, isToParachain, _e, xcmType, version, ethreumlish, convertedToAddr, convertedFromAddr, result, e_1;
var fromChainId = _b.fromChainId, toChainId = _b.toChainId, fromAddress = _b.fromAddress, toAddress = _b.toAddress, amount = _b.amount, assetId = _b.assetId, signer = _b.signer, fromApi = _b.fromApi, toApi = _b.toApi;
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
_f.trys.push([0, 2, , 3]);
_c = config_1.networks[fromChainId].polkadot, fromSs58Format = _c.ss58Format, isFromParachain = _c.isParachain;
_d = config_1.networks[toChainId].polkadot, toSs58Format = _d.ss58Format, isToParachain = _d.isParachain;
_e = (0, common_1.getXcmInfo)(fromChainId, toChainId), xcmType = _e.xcmType, version = _e.version;
console.log('xcmTypeSDK', xcmType, version);
ethreumlish = ['2004', '2023'];
convertedToAddr = ethreumlish.includes(toChainId)
? toAddress
: (0, util_crypto_1.encodeAddress)((0, util_crypto_1.decodeAddress)(toAddress), toSs58Format);
convertedFromAddr = ethreumlish.includes(fromChainId)
? fromAddress
: (0, util_crypto_1.encodeAddress)((0, util_crypto_1.decodeAddress)(fromAddress), fromSs58Format);
if (!xcmType || !version)
return [2];
result = void 0;
if (xcmType === 'xcmPallet.reserveTransferAssets') {
if (version === 'V1') {
result = (0, type_builder_1.buildXcmPalletTransferV1)(fromApi, toChainId, convertedToAddr, amount);
}
else {
result = (0, type_builder_1.buildXcmPalletTransferV2)(fromApi, toChainId, convertedToAddr, amount);
}
}
else if (xcmType === 'xTokens.transfer') {
if (version === 'V2') {
if (assetId === '32' &&
toChainId === '2087' &&
fromChainId === '2001') {
result = (0, type_builder_1.buildXTokensTransferV2)(fromApi, convertedToAddr, assetId, amount, toChainId, 'VToken', 'AccountId32');
}
else if (assetId === '31' &&
toChainId === '2087' &&
fromChainId === '2001') {
result = (0, type_builder_1.buildXTokensTransferV2)(fromApi, convertedToAddr, assetId, amount, toChainId, 'Native', 'AccountId32');
}
else if (fromChainId === '2030' && assetId === '33') {
result = (0, type_builder_1.buildXTokensTransferV2)(fromApi, convertedToAddr, assetId, amount, toChainId, 'Native', 'AccountId32');
}
else if (fromChainId === '2030' && assetId === '34') {
result = (0, type_builder_1.buildXTokensTransferV2)(fromApi, convertedToAddr, '0', amount, toChainId, 'VToken2', 'AccountId32');
}
else if (toChainId === '2004' || toChainId === '2023') {
result = (0, type_builder_1.buildXTokensTransferV2)(fromApi, convertedToAddr, assetId, amount, toChainId, 'AssetId', 'AccountKey20');
}
else if (fromChainId === '2004' || fromChainId === '2023') {
result = (0, type_builder_1.buildXTokensMoonbeamTransferV2)(fromApi, convertedToAddr, assetId, amount, toChainId);
}
else {
result = (0, type_builder_1.buildXTokensTransferV2)(fromApi, convertedToAddr, assetId, amount, toChainId, 'AssetId', 'AccountId32');
}
}
else {
if (fromChainId === '2125') {
result = (0, type_builder_1.buildXTokensTransferV3X2)(fromApi, convertedToAddr, '0', amount, toChainId);
}
else {
result = (0, type_builder_1.buildXTokensTransferV3)(fromApi, convertedToAddr, assetId, amount);
}
}
}
else if (xcmType === 'polkadotXcm.limitedReserveTransferAssets') {
if (version === 'V2') {
result = (0, type_builder_1.buildPolkadotXcmTransferV2)(fromApi, convertedToAddr, toChainId, assetId, amount, fromChainId === '1000' ? '1984' : '');
}
else {
result = (0, type_builder_1.buildPolkadotXcmTransferV3)(fromApi, convertedToAddr, toChainId, amount);
}
}
else if (xcmType === 'xcmPallet.limitedReserveTransferAssets') {
result = (0, type_builder_1.buildXcmLimitedReserveTransferV2)(fromApi, convertedToAddr, toChainId, assetId, amount);
}
else if (xcmType === 'xTokens.transferMultiasset') {
result = (0, type_builder_1.buildXcmVersionedMultiAssetV3)(fromApi, convertedToAddr, toChainId, amount, '1984', '');
}
return [4, signAndSendTransfer({
api: fromApi,
apiTo: toApi,
fromAddress: convertedFromAddr,
toAddress: convertedToAddr,
extrinsic: result(),
isIbc: false,
filter: isFromParachain ? null : fromApi.events.xcmPallet.Attempted.is,
signer: signer,
})];
case 1: return [2, _f.sent()];
case 2:
e_1 = _f.sent();
console.log('errorSDK', e_1);
return [3, 3];
case 3: return [2];
}
});
});
}
function transferIbc(_a) {
return __awaiter(this, arguments, void 0, function (_b) {
var _c, _d, _e, fromSs58Format, _f, toChainType, _g, _h, _j, toSs58Format, convertedFromAddr, convertedToAddr, extrinsic;
var fromChainId = _b.fromChainId, toChainId = _b.toChainId, fromAddress = _b.fromAddress, toAddress = _b.toAddress, amount = _b.amount, assetId = _b.assetId, signer = _b.signer, sourceChannel = _b.sourceChannel, memo = _b.memo, fromApi = _b.fromApi, toApi = _b.toApi, destinationHeight = _b.destinationHeight;
return __generator(this, function (_k) {
switch (_k.label) {
case 0:
if (!assetId)
throw 'assetId not found';
if (!sourceChannel)
throw 'sourceChannel not found';
_c = config_1.networks[fromChainId].polkadot, _d = _c === void 0 ? {} : _c, _e = _d.ss58Format, fromSs58Format = _e === void 0 ? 0 : _e;
_f = config_1.networks[toChainId], toChainType = _f.chainType, _g = _f.polkadot, _h = _g === void 0 ? {} : _g, _j = _h.ss58Format, toSs58Format = _j === void 0 ? 0 : _j;
convertedFromAddr = (0, util_crypto_1.encodeAddress)((0, util_crypto_1.decodeAddress)(fromAddress), fromSs58Format);
convertedToAddr = '';
convertedToAddr =
config_1.networks[toChainId].chainType === 'polkadot'
? (0, util_crypto_1.encodeAddress)((0, util_crypto_1.decodeAddress)(toAddress), toSs58Format)
: toAddress;
extrinsic =
toChainType === 'polkadot'
? (0, helper_1.makeIbcToPolkadot)({
api: fromApi,
toAddress: convertedToAddr,
sourceChannel: Number(sourceChannel),
assetId: assetId,
amount: amount,
destinationHeight: destinationHeight,
memo: memo,
})
: (0, helper_1.makeIbcToCosmos)({
api: fromApi,
toAddress: convertedToAddr,
sourceChannel: Number(sourceChannel),
assetId: assetId,
amount: amount,
destinationHeight: destinationHeight,
memo: memo,
});
return [4, signAndSendTransfer({
api: fromApi,
apiTo: toApi,
fromAddress: convertedFromAddr,
toAddress: convertedToAddr,
extrinsic: extrinsic,
isIbc: true,
filter: null,
signer: signer,
})];
case 1: return [2, _k.sent()];
}
});
});
}
var polkadotTransfer = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
var _c;
var fromChainId = _b.fromChainId, toChainId = _b.toChainId, fromAddress = _b.fromAddress, toAddress = _b.toAddress, amount = _b.amount, assetId = _b.assetId, signer = _b.signer, memo = _b.memo, sourceChannel = _b.sourceChannel, fromApi = _b.fromApi, toApi = _b.toApi, destinationHeight = _b.destinationHeight;
return __generator(this, function (_d) {
try {
if (((_c = (0, common_1.getXcmInfo)(fromChainId, toChainId)) === null || _c === void 0 ? void 0 : _c.type) === 'XCM')
return [2, transferXcm({
fromApi: fromApi,
toApi: toApi,
fromChainId: fromChainId,
toChainId: toChainId,
fromAddress: fromAddress,
toAddress: toAddress,
amount: amount,
assetId: assetId,
signer: signer,
})];
return [2, transferIbc({
fromChainId: fromChainId,
toChainId: toChainId,
fromAddress: fromAddress,
toAddress: toAddress,
amount: amount,
assetId: assetId,
signer: signer,
sourceChannel: sourceChannel,
memo: memo,
destinationHeight: destinationHeight,
fromApi: fromApi,
toApi: toApi,
})];
}
catch (err) {
console.error(err);
}
return [2];
});
}); };
exports.polkadotTransfer = polkadotTransfer;