@okxweb3/coin-stellar
Version:
@ok/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
164 lines • 7.07 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 = {}) {
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 (opts?.type ?? '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 ((val.constructor?.name ?? '') !== 'Object') {
throw new TypeError(`cannot interpret ${val.constructor?.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]) => {
const [keyType, valType] = (opts?.type ?? {})[k] ?? [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?.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?.type }).toScVal();
case 'string': {
const optType = opts?.type ?? '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) {
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 (scv.vec() ?? []).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((scv.map() ?? []).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