UNPKG

openchain-sdk-yxl-ts

Version:

OpenChain SDK for browser

201 lines (183 loc) 5.61 kB
import { keypair } from 'openchain-encryption-nodejs-yxl-ts'; import errors from '../exception/index.js'; /** * 资产操作相关的方法集合 * 这些方法将被混入到 Operation 类中 */ class AssetOperations { /** * 验证资产代码 * @private * @param {string} code - 资产代码 * @returns {boolean} 是否有效 */ _isValidAssetCode(code) { return code && typeof code === 'string' && code.trim().length > 0; } /** * 验证资产金额 * @private * @param {string|number} amount - 资产金额 * @returns {boolean} 是否有效 */ _isValidAssetAmount(amount) { try { const numAmount = Number(amount); return !isNaN(numAmount) && numAmount > 0; } catch { return false; } } /** * 资产发行操作 * @param {Object} args - 发行参数 * @param {string} [args.sourceAddress] - 源地址 * @param {string} args.code - 资产代码 * @param {string|number} args.assetAmount - 发行金额 * @param {string} [args.metadata] - 元数据 * @returns {Object} 操作结果 */ assetIssueOperation(args) { try { // 参数类型检查 if (Array.isArray(args) || typeof args !== 'object' || args === null) { return this._responseError(this.options.errors.INVALID_ARGUMENTS); } // 参数验证模式 const schema = { sourceAddress: { required: false, address: true, }, code: { required: true, string: true, }, assetAmount: { required: true, numeric: true, }, metadata: { required: false, string: true, }, }; // 验证参数 if (!this._validate(args, schema).tag) { return this._responseError(this.options.errors.INVALID_ARGUMENTS); } // 验证资产代码 if (!this._isValidAssetCode(args.code)) { return this._responseError(this.options.errors.INVALID_ASSET_CODE_ERROR); } // 验证资产金额 if (!this._isValidAssetAmount(args.assetAmount)) { return this._responseError(this.options.errors.INVALID_ASSET_AMOUNT_ERROR); } // 构建操作数据 return this._responseData({ operation: { type: 'issueAsset', data: this._sanitizeOperationData(args), }, }); } catch (err) { console.error('Error in assetIssueOperation:', err); return this._responseError(this.options.errors.INVALID_ARGUMENTS); } } /** * 资产转移操作 * @param {Object} args - 转移参数 * @param {string} [args.sourceAddress] - 源地址 * @param {string} args.destAddress - 目标地址 * @param {string} args.code - 资产代码 * @param {string} args.issuer - 发行者地址 * @param {string|number} args.assetAmount - 转移金额 * @param {string} [args.metadata] - 元数据 * @returns {Object} 操作结果 */ assetSendOperation(args) { try { // 参数类型检查 if (Array.isArray(args) || typeof args !== 'object' || args === null) { return this._responseError(this.options.errors.INVALID_ARGUMENTS); } // 参数验证模式 const schema = { sourceAddress: { required: false, address: true, }, destAddress: { required: true, address: true, }, code: { required: true, string: true, }, issuer: { required: true, address: true, }, assetAmount: { required: true, numeric: true, }, metadata: { required: false, string: true, }, }; // 验证参数 if (!this._validate(args, schema).tag) { return this._responseError(this.options.errors.INVALID_ARGUMENTS); } // 检查源地址和目标地址是否相同 if (args.sourceAddress && args.destAddress === args.sourceAddress) { return this._responseError(errors.SOURCEADDRESS_EQUAL_DESTADDRESS_ERROR); } // 验证资产代码 if (!this._isValidAssetCode(args.code)) { return this._responseError(this.options.errors.INVALID_ASSET_CODE_ERROR); } // 验证资产金额 if (!this._isValidAssetAmount(args.assetAmount)) { return this._responseError(this.options.errors.INVALID_ASSET_AMOUNT_ERROR); } // 构建操作数据 return this._responseData({ operation: { type: 'payAsset', data: this._sanitizeOperationData(args), }, }); } catch (err) { console.error('Error in assetSendOperation:', err); return this._responseError(this.options.errors.INVALID_ARGUMENTS); } } /** * 清理操作数据,移除未定义的字段 * @private * @param {Object} data - 原始数据 * @returns {Object} 清理后的数据 */ _sanitizeOperationData(data) { return Object.entries(data).reduce((acc, [key, value]) => { if (value !== undefined && value !== null) { acc[key] = value; } return acc; }, {}); } } // 导出操作方法 export default { assetIssueOperation: AssetOperations.prototype.assetIssueOperation, assetSendOperation: AssetOperations.prototype.assetSendOperation, _isValidAssetCode: AssetOperations.prototype._isValidAssetCode, _isValidAssetAmount: AssetOperations.prototype._isValidAssetAmount, _sanitizeOperationData: AssetOperations.prototype._sanitizeOperationData, };