@okxweb3/coin-stellar
Version:
@okxweb3/coin-stellar is a Stellar SDK for building Web3 wallets and applications. It supports Stellar and PI blockchains, enabling private key management, address generation, transaction signing, trustline creation, and asset transfers
167 lines • 7.71 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.scValToNative = exports.nativeToScVal = void 0;
const xdr_1 = __importDefault(require("./xdr"));
const address_1 = require("./address");
const contract_1 = require("./contract");
const index_1 = require("./numbers/index");
function nativeToScVal(val, opts = {}) {
var _a, _b, _c, _d, _e;
switch (typeof val) {
case 'object': {
if (val === null) {
return xdr_1.default.ScVal.scvVoid();
}
if (val instanceof xdr_1.default.ScVal) {
return val;
}
if (val instanceof address_1.Address) {
return val.toScVal();
}
if (val instanceof contract_1.Contract) {
return val.address().toScVal();
}
if (val instanceof Uint8Array || Buffer.isBuffer(val)) {
const copy = Uint8Array.from(val);
switch ((_a = opts === null || opts === void 0 ? void 0 : opts.type) !== null && _a !== void 0 ? _a : 'bytes') {
case 'bytes':
return xdr_1.default.ScVal.scvBytes(copy);
case 'symbol':
return xdr_1.default.ScVal.scvSymbol(copy);
case 'string':
return xdr_1.default.ScVal.scvString(copy);
default:
throw new TypeError(`invalid type (${opts.type}) specified for bytes-like value`);
}
}
if (Array.isArray(val)) {
if (val.length > 0 && val.some((v) => typeof v !== typeof val[0])) {
throw new TypeError(`array values (${val}) must have the same type (types: ${val
.map((v) => typeof v)
.join(',')})`);
}
return xdr_1.default.ScVal.scvVec(val.map((v) => nativeToScVal(v, opts)));
}
if (((_c = (_b = val.constructor) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '') !== 'Object') {
throw new TypeError(`cannot interpret ${(_d = val.constructor) === null || _d === void 0 ? void 0 : _d.name} value as ScVal (${JSON.stringify(val)})`);
}
return xdr_1.default.ScVal.scvMap(Object.entries(val)
.sort(([key1], [key2]) => key1.localeCompare(key2))
.map(([k, v]) => {
var _a, _b;
const [keyType, valType] = (_b = ((_a = opts === null || opts === void 0 ? void 0 : opts.type) !== null && _a !== void 0 ? _a : {})[k]) !== null && _b !== void 0 ? _b : [null, null];
const keyOpts = keyType ? { type: keyType } : {};
const valOpts = valType ? { type: valType } : {};
return new xdr_1.default.ScMapEntry({
key: nativeToScVal(k, keyOpts),
val: nativeToScVal(v, valOpts)
});
}));
}
case 'number':
case 'bigint':
switch (opts === null || opts === void 0 ? void 0 : opts.type) {
case 'u32':
return xdr_1.default.ScVal.scvU32(val);
case 'i32':
return xdr_1.default.ScVal.scvI32(val);
default:
break;
}
return new index_1.ScInt(val, { type: opts === null || opts === void 0 ? void 0 : opts.type }).toScVal();
case 'string': {
const optType = (_e = opts === null || opts === void 0 ? void 0 : opts.type) !== null && _e !== void 0 ? _e : 'string';
switch (optType) {
case 'string':
return xdr_1.default.ScVal.scvString(val);
case 'symbol':
return xdr_1.default.ScVal.scvSymbol(val);
case 'address':
return new address_1.Address(val).toScVal();
case 'u32':
return xdr_1.default.ScVal.scvU32(parseInt(val, 10));
case 'i32':
return xdr_1.default.ScVal.scvI32(parseInt(val, 10));
default:
if (index_1.XdrLargeInt.isType(optType)) {
return new index_1.XdrLargeInt(optType, val).toScVal();
}
throw new TypeError(`invalid type (${opts.type}) specified for string value`);
}
}
case 'boolean':
return xdr_1.default.ScVal.scvBool(val);
case 'undefined':
return xdr_1.default.ScVal.scvVoid();
case 'function':
return nativeToScVal(val());
default:
throw new TypeError(`failed to convert typeof ${typeof val} (${val})`);
}
}
exports.nativeToScVal = nativeToScVal;
function scValToNative(scv) {
var _a, _b;
switch (scv.switch().value) {
case xdr_1.default.ScValType.scvVoid().value:
return null;
case xdr_1.default.ScValType.scvU64().value:
case xdr_1.default.ScValType.scvI64().value:
return scv.value().toBigInt();
case xdr_1.default.ScValType.scvU128().value:
case xdr_1.default.ScValType.scvI128().value:
case xdr_1.default.ScValType.scvU256().value:
case xdr_1.default.ScValType.scvI256().value:
return (0, index_1.scValToBigInt)(scv);
case xdr_1.default.ScValType.scvVec().value:
return ((_a = scv.vec()) !== null && _a !== void 0 ? _a : []).map(scValToNative);
case xdr_1.default.ScValType.scvAddress().value:
return address_1.Address.fromScVal(scv).toString();
case xdr_1.default.ScValType.scvMap().value:
return Object.fromEntries(((_b = scv.map()) !== null && _b !== void 0 ? _b : []).map((entry) => [
scValToNative(entry.key()),
scValToNative(entry.val())
]));
case xdr_1.default.ScValType.scvBool().value:
case xdr_1.default.ScValType.scvU32().value:
case xdr_1.default.ScValType.scvI32().value:
case xdr_1.default.ScValType.scvBytes().value:
return scv.value();
case xdr_1.default.ScValType.scvSymbol().value:
case xdr_1.default.ScValType.scvString().value: {
const v = scv.value();
if (Buffer.isBuffer(v) || ArrayBuffer.isView(v)) {
try {
return new TextDecoder().decode(v);
}
catch (e) {
return new Uint8Array(v.buffer);
}
}
return v;
}
case xdr_1.default.ScValType.scvTimepoint().value:
case xdr_1.default.ScValType.scvDuration().value:
return new xdr_1.default.Uint64(scv.value()).toBigInt();
case xdr_1.default.ScValType.scvError().value:
switch (scv.error().switch().value) {
case xdr_1.default.ScErrorType.sceContract().value:
return { type: 'contract', code: scv.error().contractCode() };
default: {
const err = scv.error();
return {
type: 'system',
code: err.code().value,
value: err.code().name
};
}
}
default:
return scv.value();
}
}
exports.scValToNative = scValToNative;
//# sourceMappingURL=scval.js.map