npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@soundsright/sdk

v0.2.8

Published

soundsright chain sdk

Downloads

87

Readme

@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模块,用于分享