openchain-sdk-yxl-ts
Version:
OpenChain SDK for browser
201 lines (183 loc) • 5.61 kB
JavaScript
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,
};