0.2.8 • Published 1 year ago

@soundsright/sdk v0.2.8

Weekly downloads
-
License
MIT
Repository
-
Last release
1 year ago

@soundsright/sdk

@soundsright sdk 功能库

Example

Example

安装

npm install @soundsright/sdk;

快速开始

import SDK from "@soundsright/sdk";

const sdk = new SDK({ env: 'dev' });

初始化

创建实例初始化

const sdk = new SDK(options?);

初始化的options选项

{
  env?: Env, // 环境设置。默认值:'dev', 可选值:'dev' | 'test' | 'pre' | 'prod'
  requestHandler?: RequestHandler,  // 请求委托函数,主要用于service模块。通常情况下无须手动配置,默认使用基于axios的XHR,在某些特殊的应用场景下,可能需要手动指定委托。
  supportedChainId?: number // 指定链id,指定后合约交互时会自动验证当前钱包所在的链。也可以不在初始化时指定,使用sdkInstance.chain.setSupportedChainId设置。
}

特殊用法 - 定制RequestHandler

方法的签名:

export declare type RequestMethod = 'get' | 'post' | 'put' | 'delete' | 'head' | 'patch';
export declare type RequestHeaders = {
    'Content-Type'?: string;
    'Authorization'?: string;
    [x: string]: string | number | boolean | undefined | null;
};
export declare type RequestOptions = {
    url: string;
    method?: RequestMethod;
    headers?: RequestHeaders;
    params?: Record<string, any>;
    data?: Record<string, any>;
    [x: string]: any;
};
export declare type RequestResult = {
    [x: string]: any;
};
export declare type RequestHandler = (options: RequestOptions) => Promise<RequestResult>;

自定义的requestHandler例子:

// 基于window.fetch 实现一个requestHandler
const requestHandler = async ({ url, method, headers, params, data, ...opts }) => {
  const res = await window.fetch(`${url}${params?`?${qs.stringify(params)}`:''}`, {
    method,
    headers,
    body: data && JSON.stringify(data),
    ...opts
  });
  return res.json();
}

功能模块

目前集成的主要功能模块有:

  • auth,基础功能模块,用于实现第三方授权登录及钱包登录
  • connector,基础功能模块,用于实现钱包连接
  • service,基础功能模块,实现与服务器接口交互
  • user,业务功能模块,实现用户登录、统一处理token、用户信息等
  • chain,基础功能模块,实现链上合约操作
  • share,基础功能模块,实现分享功能
  • invite,基础功能模块,实现邀请人的基础操作
  • contracts,合约abi集合模块
  • nftMarket,业务功能模块,封装了与nft市场交互的业务逻辑

auth模块

基础功能模块,用于实现第三方授权登录及钱包登录
支持的第三方登录方式:Google、Facebook、Twitter

// Facebook 授权
const authResult = await sdk.auth.authByFacebook();
// authResult = { type: "Facebook", token: [access_token] }

// Google 授权
const authResult = await  sdk.auth.authByGoogle();
// authResult = { type: "Google", token: [access_token] }

// Twitter 授权
const authResult = await sdk.auth.authByTwitter();
// authResult = { type: "Twitter", token: [oauth_token], verifier: [oauth_verifier] }

// Wallet 连接签名
const authResult = await sdk.auth.authByWallet(options?);
// options = { 
//   connectType?: "MetaMask" 或 "WalletConnect",若sdk.connector已连接,则无须指定,仅在sdk.connector未连接或需要更换连接类型时指定,将调用connector进行钱包连接
//   signMessage: 自定义的签名源消息,如:"Welcome to Lyrra!",
//   afterConnect: (state: ConnectState) => Promise<void> | void
// }
// authResult = { 
//   type: "Wallet", 
//   token: 等同于signature,
//   signature: 签名值,
//   message: 源消息,
//   walletAddr: 用户地址,
// }

// 第三方平台授权,根据第三方类型
const authResult = await sdk.auth.authByThirdPlatform(type); // type: 'Google' | 'Facebook' | 'Twitter'

connector模块

基础功能模块,用于实现钱包连接,及钱包连接状态的监听,是链操作的基础 支持的钱包连接方式:MetaMask(浏览器插件方式)、WalletConnect(App方式)

// 使用MetaMask方式连接浏览器插件钱包
await sdk.connector.connect("MetaMask");
// 使用WalletConnect方式连接App钱包
await sdk.connector.connect("WalletConnect");
// 尝试以上次连接方式连接钱包
await sdk.connector.tryLastConnect();

// 获取连接的状态数据
const { account, chainId, provider, signer, connected } = sdk.connector.state;
// 获取当前连接的类型
const { type } = sdk.connector;
// type可能为:"MetaMask" | "WalletConnect" | undefined

// 切换链
await sdk.connector.switchChain(newChainId);

// 增加新的token
await sdk.connector.addToken({ "0x123124...", "USDC", 6 });

// 监听连接状态事件
sdk.connector.on(event, handler); 

// event包括:
// - change,统一状态变化事件,任何状态变化都会触发该事件
// - connect,新连接建立时触发。MetaMask在切换不同类型的链时,也可能触发,比如:从 ethereum 切换到 polygon
// - disconnect,断开连接时触发。MetaMask在切换不同类型的链时,也可能触发,比如:从 ethereum 切换到 polygon
// - accountsChanged,用户切换钱包地址时触发
// - chainChanged,用户切换链时触发
// - uriAvailable,仅WalletConnect方式生成连接uri时触发。

// handler的参数e:
// e.event,仅在change触发时会传入该字段,值为"connect"、"accountsChanged"等具体事件名
// e的其他字段完全与connector.state一致,包括:account, chainId, provider, signer, connected

// 高级用法:
// 设置自定义缓存对象。
sdk.connector.setCache(storage); 
// storage 对象必须参考localStorage实现,即具备get和set方法。

// 注册自定义uri处理程序,主要用于WalletConnect方式中,定制弹窗界面。
sdk.connector.registUriHandler(handler);
// handler的函数声明为:(uri: string, disconnect: () => void) => () => void; 即:
// handler的参数为:uri, disconnect,其中uri用于展示给用户,帮助建立连接,disconnect是个函数,用于在用户取消连接时,断开连接,由于WalletConnect机制问题,这是必要的。
// handler的返回值是:() => void,即一个函数。该函数应该是一个取消处理程序的函数,比如:关闭当前正在显示的弹窗。
// WalletConnect在连接成功或钱包app内用户取消连接的情况下,会执行该函数。如果无须任何操作,可以返回一个空函数。

ConnectorHelper 帮助方法

某些场景下,可能需要对connector做一些特殊的定制,其中一个需求是定制WalletConnect的弹窗界面,这里提供了一些帮助方法,用于快速实现功能

// 引入
import { ConnectorHelper } from "@soundsright/connector";

// 使用uri,唤起app。该方法主要用于安卓中。
ConnectorHelper.openUri(uri); 
// 使用uri,及相应app钱包配置信息,唤起app。该方法主要用于pc或ios中。walletConfig可由下面的方法获取。
ConnectorHelper.openAppUri(uri, walletConfig);

// 获取IOS中支持的钱包app列表,返回值为:walletConfig[],whiteList参数为app名称的string[]
const walletConfigs = await ConnectorHelper.getIOSWalletConfigs(whiteList?);

// 获取pc中支持的钱包app列表,返回值为:walletConfig[],whiteList参数为app名称的string[]
const walletConfigs = await ConnectorHelper.getDesktopWalletConfigs(whiteList?);

// 【不常用】设置fetch请求委托。用于非浏览器环境的特殊定制。
ConnectorHelper.setFetchHandler(fetchHandler);

service模块

基础功能模块,实现与服务器接口交互

// 核心方法,发送到网关的请求
const data = await sdk.service.request(options);
// options选项:
// RequestOptions = {
//   url: string; // 凡是到网关的请求,url只写path即可
//   method?: RequestMethod; // 
//   headers?: RequestHeaders;
//   params?: Record<string, any>;
//   data?: Record<string, any>;
//   [x: string]: any; // 其他参数由RequestHandler自行处理
// };
// 
// RequestMethod = 'get' | 'post' | 'put' | 'delete' | 'head' | 'patch';
// RequestHeaders = {
//   'Content-Type'?: string;  // 默认统一为'application/json',如果某服务或接口不一致,则需要手动指定
//   'Authorization'?: string;  // 如果使用user进行用户登录,则无须手动处理登录态的header
//   [x: string]: string | number | boolean | undefined | null;
// };
// 返回值:
// 网关接口的统一返回格式为:{ code, data?, msg }。函数的正常返回值为data字段值。
// 若接口内部错误,或网络异常,会抛出 ServiceError,e.name = 'ServiceError',e.code = 接口返回的code或网络异常-1,e.message = 接口返回的msg
// user模块会对用户token失效等接口错误,进行拦截处理。但对于接口需要用户登录,但用户token无效时,会抛出UserError,e.name = 'UserError'。具体参考user模块。
// 请求示例:
// const res = await sdk.service.request({ url: '/ucenter/user/login', method: 'post', data: { type: 'Facebook', token: 'xxxxxxxxxxx...' } });
// console.log('登录成功', res);



// 简化方法,发送get请求
sdk.service.get(url: string, params?: Record<string, any>, headers?: RequestHeaders): Promise<any>;
// 请求示例:获取用户信息
// const user = await sdk.service.get('/ucenter/user/info', {}, { Authorization: 'xxxxxxx' });

// 简化方法,发送post请求
sdk.service.post(url: string, data?: Record<string, any>, headers?: RequestHeaders): Promise<any>;
// 请求示例:刷新accessToken
// const res = await this.service.post('/ucenter/user/refreshToken', {}, { refreshToken: 'xxxxxx' });

// 设置统一的请求header
sdk.service.setHeaders({ 'X-Request-CSRF': "123" });

// 移除全部自定义的公共请求header
sdk.service.removeHeaders(): void;

// 设置一个公共的请求拦截处理器,具体见下方例子
sdk.service.onBeforeRequest(handler: BeforeRequestHandler);

// 设置一个公共的返回值拦截处理器,具体见下方说明
sdk.service.onBeforeResponse(handler: BeforeResponseHandler);


/**
 * 下单 - 目前仅用于法币支付时
 * @param skuId - 商品skuId
 * @param payChannel - 支付渠道,传入PayChannel枚举或对应的数字值 - enum PayChannel { Checkout = 1 }
 * @param channelOptions - 渠道参数,每个渠道都有自己的要求。对于Checkout 传入 { payType: 1, countryCode: number - 国家代码, userAddress: string - 用户地址 },可参考服务端文档
 * @returns 订单号和支付链接等字段 - { orderNo: string, payUrl: string }
 */
sdk.service.nft.createOrder(skuId: string, payChannel: PayChannel, channelOptions?: object): Promise<{ orderNo: string, payUrl: string }>;

/**
 * 查询订单状态 - 目前仅用于法币支付时
 * @param orderNo - 订单号
 * @returns 订单号和订单状态 - { orderNo: string, orderStatus: number },对应的orderStatus值有:1-未支付、2-已过期、3-已支付、4-上链成功、5-购买完成
 */
sdk.service.nft.queryOrderStatus(orderNo: string | number): Promise<{ orderNo: string, orderStatus: number }>;

设置公共请求拦截处理器

示例:拦截请求,统一处理token

sdk.service.onBeforeRequest((options) => {
  // options参数就是 RequestOptions 包含了请求的所有信息
  const headers = {
    Authorization: this.accessToken || '',
    ...options.headers,
  };
  // 拦截器处理后必须返回经过处理的options
  return { ...options, headers };
});

设置公共的返回值拦截处理器

可以用来统一处理接口错误,弹出错误提示等。
示例:拦截接口错误,弹出错误信息

sdk.service.onBeforeResponse(async (req, res) => {
  alert(`请求出错:${res.msg}`);
  // 注意对于用户登录状态的错误,包括accessToken失效或为空、refreshToken过期等,由user模块中注册的拦截器处理。
});

user模块

业务功能模块,实现用户登录、统一处理token、用户信息等
用户模块会根据用户登录状态对service模块实现一定的逻辑处理。

  • 在用户登录成功时,向service请求模块注入header - Authorization: accessToken
  • 在service模块发送请求时,若accessToken失效,则用户模块会静默进行token的刷新,并重新请求
  • 若刷新时refreshToken失效,则会触发事件"tokenExpired",可以监听该事件统一处理 基础用法:
try {
  const user = await sdk.user.loginByThirdPlatform('Google');
  ...
} catch (e) {
  alert(e.message);
}

用户信息的完整定义字段:(由接口定义,可能会更新)

type User = {
  UserCode: string,   // 一般对前端无用
  NewUser: boolean,   // 是否是新注册用户
  WalletAddr: string | undefined,  // 钱包地址
  NickName: string | undefined,  // 用户昵称
  Picture: string | undefined,  // 用户头像
  Phone: string | undefined,  // 用户手机号
  Email: string | undefined  // 用户邮箱
}

方法列表:

/**
 * 通过第三方平台登录
 * @param type - 第三方登录类型:'Google' | 'Facebook' | 'Twitter'
 * @returns 用户信息
 */
loginByThirdPlatform(type: ThirdPlatformAuthType): Promise<any>;
/**
 * 通过钱包连接和签名登录
 * @param options - 钱包授权的选项
 * ```ts
 * {
 *   connectType?: ConnectType枚举或"MetaMask"|"WalletConnect",
 *   signMessage?: 签名消息,
 *   afterConnect: (state: ConnectState) => Promise<void> | void
 * }
 * @returns 用户信息
 * ```
 */
loginByWallet(options?: WalletAuthOptions): Promise<any>;
/**
 * 通过cookie记录的token进行登录
 * @returns 用户信息
 */
loginByCookie(): Promise<any>;
/**
 * 设置是否记住用户登录状态
 * @param remember - 是否记住用户登录状态
 * @param days - 记住的天数,默认为7天
 */
setRememberState(remember: boolean, days?: number): void;
/**
 * 查询记住用户状态的天数
 * @returns number,返回记住的天数。如果为0,则仅在Session期有效。
 */
getRememberDays(): number;
/**
 * 查询是否记住用户的状态
 * @returns boolean
 */
getRememberState(): boolean;
/**
 * 刷新用户Token
 * @returns
 * ```ts
 * { accessToken: string, refreshToken: string }
 * ```
 */
refresh(): Promise<any>;
/**
 * 获取当前登录的用户基本信息
 * @returns 包括 { UserCode, NickName, Picture, Email, Phone, WalletAddr, NewUser }
 */
getCurrentUser(): any;
/**
 * 用户退出
 */
logout(): Promise<void>;
/**
 * 查询用户是否登录
 * @returns boolean
 */
isLogin(): boolean;
/**
 * 查询用户是否已经绑定钱包
 * @returns boolean
 */
isWalletBound(): boolean;
/**
 * 绑定第三方平台账号
 * @param type - 第三方登录类型:'Google' | 'Facebook' | 'Twitter'
 * @returns 用户信息
 */
bindThirdPlatform(type: ThirdPlatformAuthType): Promise<any>;
/**
 * 通过钱包连接和签名绑定钱包
 * @param options - 钱包授权的选项
 * ```ts
 * {
 *   connectType?: ConnectType枚举或"MetaMask"|"WalletConnect",
 *   signMessage?: 签名消息
 * }
 * @returns 用户信息
 * ```
 */
bindWallet(options?: WalletAuthOptions): Promise<any>;
/**
 * 检查用户是否具备执行合约的条件。若不符合条件,则抛出相应的异常 - 该方法应作为执行合约的前置检测方法(模板方法)
 * Error类型有:
 * - UnauthorizedError,用户未登录,需要弹出登录窗口
 * - WalletNotBoundError,用户未绑定钱包,需要弹出绑定钱包
 * - WalletNotConnectedError,用户未连接钱包,需要弹出钱包连接
 * - WalletNotMatchError,用户已连接的钱包地址与绑定的钱包地址不匹配
 * 可以使用try catch 来处理相应的错误,可以通过error.name 来方便的判定类型。
 * 在项目中结合界面操作逻辑,对该方法做进一步封装
 * ```ts
 * try {
 *   sdk.user.checkUserWeb3Condition();
 * } catch (e) {
 *  if(e.name === 'UnauthorizedError') {
 *    // do something
 *  }
 *  ...
 * }
 * ```
 */
checkUserWeb3Condition(): void;
/**
 * 监听用户模块触发的事件,目前包括以下事件:
 * 'tokenExpired' - 在调用需要用户token的接口,但本地token不存在或已失效时触发,无参数。监听该事件可以用来弹出用户登录的UI。
 * 'loginSuccess' - 登录成功并获取到用户信息时触发,事件参数为user对象。监听该事件可以统一处理用户登录成功的状态。
 * 'logout' - 用户退出时触发,无参数。监听该事件可以统一处理用户退出状态。
 * 'userUpdate' - 用户更新时触发,事件参数为用户对象。监听该事件可以处理用户更新的状态。如:钱包绑定更新。注意:绑定第三方账号,并不会触发该更新。
 */ 
on(event, handler): void;

// 示例:
sdk.user.on("tokenExpired", () => {
  // 弹出用户登录界面
});
sdk.user.on("loginSuccess", (user) => {
  // 用户信息处理
});
sdk.user.on("logout", () => {});
sdk.user.on("userUpdate", (user) => {
  // 用户信息更新
});

chain模块

基础功能模块,实现链上合约操作

// sdk.chain
getContract(address: string, abi: ContractInterface): Contract;
getUncheckedContract(address: string, abi: ContractInterface): Contract;
getLocalChain(chainId: number): LocalChain;  // 获取一个使用本地网络provider构造的chain实例,可以无需连接钱包直接执行一些查询方法
setSupportedChainId(chainId: number): void;
checkChain(): Promise<void>;
signMessage(message: string): Promise<string>;
signTypedMessage(domain: SignDomain, types: SignMessageTypes, value: SignMessageValue): any;
getBalance(account: string): Promise<string>;
checkTransaction(tx: any): Promise<boolean>;
tryTransaction(txPromise: Promise<any>): Promise<boolean>;

// sdk.chain.local - 一个使用本地网络provider构造的chain实例,用于无需连接钱包直接执行一些查询方法。
// 只有指定supportedChainId之后,才能获取该实例。可以通过sdk初始化时或sdk.chain.setSupportedChainId(chainId)来设置链
// 跟sdk.chain一样具有一些预置的模块:sdk.chain.local.nft、sdk.chain.local.token,但需要注意的是,只能使用其中的查询方法
getContract(address: string, abi: ContractInterface): Contract;
getBalance(address: string): Promise<string>;
tryGet(txPromise: Promise<any>): Promise<any>;
checkTransaction(tx: any): Promise<boolean>;
tryTransaction(txPromise: Promise<any>): Promise<boolean>;
setLocalProvider(chainId?: number): void;

// sdk.chain.nft
buyAndMint(address: string, tokenId: string, to: string, tokenURI: string, skuInfo: SkuInfoV1, v: number, r: string, s: string, overrides?: ContractWriteMethodOverrides): Promise<void>;
ownerOf(address: string, tokenId: string): Promise<string>;

// sdk.chain.token
approve(address: string, account: string, spender: string, amount: string): Promise<void>;
balanceOf(address: string, account: string): Promise<string>;
decimals(address: string): Promise<number>;
compareAmount(amount1: string, amount2: string): Promise<1 | -1 | 0>;
isBalanceEnough(address: string, account: string, amount: string): Promise<boolean>;

share模块

基础功能模块,实现分享功能

/**
 * 获取分享链接
 * @param shareParams - 分享文案及描述:
 * ```ts
 * type ShareParams = {
 *   title: string,  // 标题文字
 *   description: string,  // 描述文字
 *   image?: string,  // 头图
 *   url?: string,  // 跳转目标url,若不传默认跳转到 https://www.lyrra.io。
 *   text?: string,  // 推荐语,分享到twitter时会显示
 *   inviter?: string, // 邀请人(用户编码),若传入则将邀请人拼接到url中
 *   short?: boolean, // 是否使用短链形式分享。默认为true
 * }
 * ```
 * @returns 返回链接url
 */
getShareUrl(params: ShareParams): Promise<string>;
/**
 * 分享到指定平台
 * @param platform - 平台类型:enum SharePlatform { Facebook: "Facebook", Twitter: "Twitter" }
 * @param shareParams - 分享文案及描述:
 * ```ts
 * type ShareParams = {
 *   title: string,  // 标题文字
 *   description: string,  // 描述文字
 *   image?: string,  // 头图
 *   url?: string,  // 跳转目标url,若不传默认跳转到 https://www.lyrra.io。
 *   text?: string,  // 推荐语,可为空
 *   inviter?: string, // 邀请人(用户编码),若传入则将邀请人拼接到url中
 *   short?: boolean, // 是否使用短链形式分享。默认为true
 * }
 * ```
 * @param windowOptions - 分享窗口的配置,一般无须配置
 * @returns 打开的分享窗口
 */
shareTo(platform: SharePlatform, shareParams: ShareParams, windowOptions?: OpenWindowOptions): Promise<Window>;
/**
 * 分享到Facebook
 * @param shareParams - 分享文案及描述:
 * ```ts
 * type ShareParams = {
 *   title: string,  // 标题文字
 *   description: string,  // 描述文字
 *   image?: string,  // 头图
 *   url?: string,  // 跳转目标url,若不传默认跳转到 https://www.lyrra.io。
 *   text?: string,  // 推荐语,可为空
 *   inviter?: string, // 邀请人(用户编码),若传入则将邀请人拼接到url中
 *   short?: boolean, // 是否使用短链形式分享。默认为true
 * }
 * ```
 * @param windowOptions - 分享窗口的配置,一般无须配置
 * @returns 打开的分享窗口
 */
shareToFacebook(shareParams: ShareParams, windowOptions?: OpenWindowOptions): Promise<Window>;
/**
 * 分享到Twitter
 * @param shareParams - 分享文案及描述:
 * ```ts
 * type ShareParams = {
 *   title: string,  // 标题文字
 *   description: string,  // 描述文字
 *   image?: string,  // 头图
 *   url?: string,  // 跳转目标url,若不传默认跳转到 https://www.lyrra.io。
 *   text?: string,  // 推荐语,可为空
 *   inviter?: string, // 邀请人(用户编码),若传入则将邀请人拼接到url中
 *   short?: boolean, // 是否使用短链形式分享。默认为true
 * }
 * ```
 * @param windowOptions - 分享窗口的配置,一般无须配置
 * @returns 打开的分享窗口
 */
shareToTwitter(shareParams: ShareParams, windowOptions?: OpenWindowOptions): Promise<Window>;
/**
 * 复制分享链接
 * @param shareParams - 分享文案及描述:
 * ```ts
 * type ShareParams = {
 *   title: string,  // 标题文字
 *   description: string,  // 描述文字
 *   image?: string,  // 头图
 *   url?: string,  // 跳转目标url,若不传默认跳转到 https://www.lyrra.io。
 *   text?: string,  // 推荐语,分享到twitter时会显示
 *   inviter?: string, // 邀请人(用户编码),若传入则将邀请人拼接到url中
 *   short?: boolean, // 是否使用短链形式分享。默认为true
 * }
 * ```
 * @returns 返回链接url
 */
copyShareUrl(shareParams: ShareParams): Promise<string>;
/**
 * 复制链接
 * @param url - 普通文本链接
 */
copyUrl(url: string): void;
/**
 * 设置请求方法,特殊情况下使用
 * @param handler - RequestHandler
 */
setRequestHandler(handler: RequestHandler): void;

// 示例:
const shareConfig = {
  title: "这是标题",
  description: "这是描述",
  image: "https://www.disney.co.jp/content/dam/disney/images/studio/buzzlightyear/ogp/ogp_buzzlightyear_01.jpg",
  url: "https://www.lyrra.io",
  text: "这是推荐语"
};

sdk.share.shareToFacebook(shareConfig); // 打开小窗口调起Facebook分享

invite模块

基础功能模块,实现邀请人的基础操作

/**
 * 从url中获取邀请人
 * @returns 邀请人(用户编码)
 */
getInviterFromUrl(): string | undefined;
/**
 * 将url中的邀请人缓存到cookie中,可供全部子域和页面使用
 * @param expires - cookie过期时间(天),默认1天
 * @returns 邀请人(用户编码)
 */
cacheInviter(expires?: number): string | undefined;
/**
 * 移除cookie中的邀请人缓存
 */
uncacheInviter(): void;
/**
 * 获取邀请人
 * @returns 邀请人(用户编码)
 */
getInviter(): string | undefined;

// 示例:
sdk.invite.getInviter();

nftMarket模块

业务功能模块,封装了与nft市场交互的业务逻辑

/**
 *
 * @param payType - 支付类型枚举:enum PayType { ETH = 'ETH', Erc20 = 'Erc20', Currency = 'Currency' }
 * @param options - 支付选项:NftBuyOptions
 * ```ts
 * NftBuyOptions = NftBuyByETHOptions | NftBuyByErc20Options | NftBuyByCurrencyOptions
 * // 当payType为PayType.ETH时:
 * type NftBuyByETHOptions = {
 *     skuId: string;
 *     beforeSwitchChain?: (e: SwitchChainData) => Promise<void> | void; // 钩子函数 - 切换链之前;SwitchChainData = { targetChainId: number, oldChainId: number }
 *     switchChainSuccess?: (e: SwitchChainData) => void;  // 钩子函数 - 切换链成功;SwitchChainData = { targetChainId: number, oldChainId: number }
 *     switchChainFailed?: (e: Error & SwitchChainData) => void;  // 钩子函数 - 切换链失败;SwitchChainData = { targetChainId: number, oldChainId: number }
 *     beforeOrder?: () => Promise<void> | void; // 钩子函数 - 创建订单前
 *     afterOrder?: (apiData: any) => Promise<void> | void; // 钩子函数 - 创建订单后
 *     beforeExchange?: () => Promise<void> | void; // 钩子函数 - 交易合约前
 * };
 * // 当payType为PayType.Erc20时:
 * type NftBuyByErc20Options = {
 *     skuId: string;
 *     beforeSwitchChain?: (e: SwitchChainData) => Promise<void> | void; // 钩子函数 - 切换链之前;SwitchChainData = { targetChainId: number, oldChainId: number }
 *     switchChainSuccess?: (e: SwitchChainData) => void;  // 钩子函数 - 切换链成功;SwitchChainData = { targetChainId: number, oldChainId: number }
 *     switchChainFailed?: (e: Error & SwitchChainData) => void;  // 钩子函数 - 切换链失败;SwitchChainData = { targetChainId: number, oldChainId: number }
 *     beforeOrder?: () => Promise<void> | void; // 钩子函数 - 创建订单前
 *     afterOrder?: (apiData: any) => Promise<void> | void; // 钩子函数 - 创建订单后
 *     beforeQueryBalance?: () => Promise<void> | void;  // 钩子函数 - 查询余额前
 *     afterQueryBalance?: (balance: string) => Promise<void> | void;  // 钩子函数 - 查询余额后
 *     beforeApprove?: () => Promise<void> | void; // 钩子函数 - Approval合约之前
 *     beforeExchange?: () => Promise<void> | void; // 钩子函数 - 交易合约前
 *     checkBalance?: boolean; // 默认为true,执行购买前优先检查erc余额
 * };
 * // 当payType为PayType.Currency时:
 * type NftBuyByCurrencyOptions = {
 *     skuId: string;
 *     payChannel: PayChannel; // enum PayChannel { Sendwyre = 2 }
 *     beforeOrder?: () => Promise<void> | void; // 钩子函数 - 创建订单前
 *     beforePay?: (order: any) => Promise<void> | void; // 钩子函数 - 支付前
 *     paySuccess?: () => Promise<void> | void; // 钩子函数 - 支付成功
 *     payCancel?: () => void; // 钩子函数 - 支付取消
 * };
 * ```
 * @returns Promise<void>,若异常会抛出相应的Error
 */
buyAndMint(payType: PayType, options: NftBuyOptions): Promise<void>;

// 示例:代币购买
await sdk.nftMarket.buyAndMint(PayType.Erc20, {
  skuId: "115"
});

// 示例:法币购买
await sdk.nftMarket.buyAndMint(PayType.Currency, {
  skuId: "115",
  payChannel: PayChannel.Sendwyre, // 或传入 2
});

npm包列表

  • @soundsright/types - 跨包的类型定义
  • @soundsright/utils - 通用函数集合
  • @soundsright/auth - auth模块,用于第三方授权和钱包授权
  • @soundsright/chain - chain模块,用于链操作
  • @soundsright/connector - connector模块,用于连接钱包
  • @soundsright/contracts - contracts模块,合约api集合
  • @soundsright/sdk - 功能统一集成的sdk
  • @soundsright/service - service模块,用于服务器操作
  • @soundsright/user - user模块,用于用户登录状态的操作
  • @soundsright/share - share模块,用于分享
0.2.7

1 year ago

0.2.8

1 year ago

0.2.6

2 years ago

0.2.3

2 years ago

0.2.2

2 years ago

0.2.5

2 years ago

0.2.4

2 years ago

0.0.1-alpha.12

2 years ago

0.0.30

2 years ago

0.0.1-alpha.11

2 years ago

0.0.1-alpha.14

2 years ago

0.0.1-alpha.13

2 years ago

0.0.1-beta.7

2 years ago

0.0.1-beta.6

2 years ago

0.0.1-beta.9

2 years ago

0.0.1-beta.8

2 years ago

0.1.0

2 years ago

0.1.2

2 years ago

0.1.1

2 years ago

0.0.26

2 years ago

0.0.1-beta.3

2 years ago

0.0.27

2 years ago

0.0.28

2 years ago

0.0.1-beta.5

2 years ago

0.0.29

2 years ago

0.0.1-beta.4

2 years ago

0.1.4

2 years ago

0.1.3

2 years ago

0.1.6

2 years ago

0.1.5

2 years ago

0.0.20

2 years ago

0.0.21

2 years ago

0.0.22

2 years ago

0.0.23

2 years ago

0.0.24

2 years ago

0.0.25

2 years ago

0.0.1-beta.21

2 years ago

0.0.1-beta.20

2 years ago

0.0.1-beta.23

2 years ago

0.0.1-beta.22

2 years ago

0.0.15

2 years ago

0.0.16

2 years ago

0.0.17

2 years ago

0.0.18

2 years ago

0.0.19

2 years ago

0.0.1-beta.25

2 years ago

0.0.1-beta.24

2 years ago

0.0.1-beta.27

2 years ago

0.0.1-beta.26

2 years ago

0.0.10

2 years ago

0.0.11

2 years ago

0.0.12

2 years ago

0.0.13

2 years ago

0.0.14

2 years ago

0.0.1-beta.10

2 years ago

0.2.1

2 years ago

0.0.3

2 years ago

0.0.1-beta.12

2 years ago

0.2.0

2 years ago

0.0.2

2 years ago

0.0.1-beta.11

2 years ago

0.0.9

2 years ago

0.0.8

2 years ago

0.0.1-beta.17

2 years ago

0.0.5

2 years ago

0.0.1-beta.14

2 years ago

0.0.4

2 years ago

0.0.1-beta.13

2 years ago

0.0.7

2 years ago

0.0.1-beta.16

2 years ago

0.0.6

2 years ago

0.0.1-beta.15

2 years ago

0.0.1-beta.2

2 years ago

0.0.1-beta.1

2 years ago

0.0.1-alpha.10

2 years ago

0.0.1-alpha.9

2 years ago

0.0.1-alpha.8

2 years ago

0.0.1-alpha.7

2 years ago

0.0.1-alpha.6

2 years ago

0.0.1-alpha.5

2 years ago

0.0.1-alpha.4

2 years ago

0.0.1-alpha.3

2 years ago

0.0.1-alpha.2

2 years ago

0.0.1-alpha.1

2 years ago

0.0.1-alpha.0

2 years ago