sensible-sdk
Version:
Sensible-SDK
561 lines (559 loc) • 20.6 kB
TypeScript
/// <reference types="node" />
import { Bytes, Int } from "scryptlib";
import * as BN from "../bn.js";
import * as bsv from "../bsv";
import { SatotxSigner, SignerConfig } from "../common/SatotxSigner";
import * as Utils from "../common/utils";
import { SigHashInfo, SigInfo } from "../common/utils";
import { API_NET, API_TARGET, FungibleTokenUnspent, SensibleApiBase } from "../sensible-api";
import * as ftProto from "./contract-proto/token.proto";
export declare const sighashType: number;
export declare const defaultSignerConfigs: SignerConfig[];
declare type ParamUtxo = {
txId: string;
outputIndex: number;
satoshis: number;
wif?: string;
address?: string | bsv.Address;
};
declare type ParamFtUtxo = {
txId: string;
outputIndex: number;
tokenAddress: string;
tokenAmount: string;
wif?: string;
};
declare type TokenReceiver = {
address: string;
amount: string;
};
declare type MockData = {
sensibleApi: SensibleApiBase;
satotxSigners: SatotxSigner[];
};
export declare type Utxo = {
txId: string;
outputIndex: number;
satoshis: number;
address: bsv.Address;
};
export declare type FtUtxo = {
txId: string;
outputIndex: number;
satoshis?: number;
lockingScript?: bsv.Script;
tokenAddress?: bsv.Address;
tokenAmount?: BN;
satotxInfo?: {
txId?: string;
outputIndex?: number;
txHex?: string;
preTxId?: string;
preOutputIndex?: number;
preTxHex?: string;
};
preTokenAddress?: bsv.Address;
preTokenAmount?: BN;
preLockingScript?: bsv.Script;
publicKey?: bsv.PublicKey;
};
/**
Sensible Fungible Token
*/
export declare class SensibleFT {
private signers;
private feeb;
private network;
private purse;
sensibleApi: SensibleApiBase;
private zeroAddress;
private debug;
private transferPart2?;
private signerSelecteds;
private dustCalculator?;
rabinPubKeyArray: Int[];
rabinPubKeyHashArray: Bytes;
rabinPubKeyHashArrayHash: Buffer;
transferCheckCodeHashArray: Bytes[];
unlockContractCodeHashArray: Bytes[];
/**
*
* @param signers
* @param signerSelecteds (Optional) the indexs of the signers which is decided to verify
* @param feeb (Optional) the fee rate. default is 0.5
* @param network (Optional) mainnet/testnet default is mainnet
* @param purse (Optional) the private key to offer transacions fee. If not provided, bsv utoxs must be provided in genesis/issue/transfer.
* @param debug (Optional) specify if verify the tx when genesis/issue/transfer, default is false
* @param apiTarget (Optional) SENSIBLE/METASV, default is SENSIBLE.
* @param dustLimitFactor (Optional) specify the output dust rate, default is 0.25 .If the value is equal to 0, the final dust will be at least 1.
* @param dustAmount (Optional) specify the output dust.
*/
constructor({ signers, signerSelecteds, feeb, network, purse, debug, apiTarget, apiUrl, mockData, dustLimitFactor, dustAmount, }: {
signers?: SignerConfig[];
signerSelecteds?: number[];
feeb?: number;
network?: API_NET;
purse?: string;
debug?: boolean;
apiTarget?: API_TARGET;
apiUrl?: string;
mockData?: MockData;
dustLimitFactor?: number;
dustAmount?: number;
});
/**
* Pick the signer with the best connectivity
* @param signerConfigs
* @returns
*/
static selectSigners(signerConfigs?: SignerConfig[]): Promise<{
signers: SignerConfig[];
signerSelecteds: number[];
}>;
/**
* set dust. DustAmount has a higher priority than dustLimitFactor
* @param dustLimitFactor specify the output dust rate, default is 0.25 .If the value is equal to 0, the final dust will be at least 1.
* @param dustAmount specify the output dust
*/
setDustThreshold({ dustLimitFactor, dustAmount, }: {
dustLimitFactor?: number;
dustAmount?: number;
}): void;
private getDustThreshold;
private _pretreatUtxos;
private _pretreatFtUtxos;
/**
* Create a transaction for genesis
* @param tokenName token name, limited to 20 bytes
* @param tokenSymbol the token symbol, limited to 10 bytes
* @param decimalNum the decimal number, range 0-255
* @param utxos (Optional) specify bsv utxos
* @param changeAddress (Optional) specify bsv changeAddress
* @param opreturnData (Optional) append an opReturn output
* @param genesisWif the private key of the token genesiser
* @param noBroadcast (Optional) whether not to broadcast the transaction, the default is false
* @returns
*/
genesis({ tokenName, tokenSymbol, decimalNum, utxos, changeAddress, opreturnData, genesisWif, noBroadcast, }: {
tokenName: string;
tokenSymbol: string;
decimalNum: number;
utxos?: ParamUtxo[];
changeAddress?: string | bsv.Address;
opreturnData?: any;
genesisWif: string | bsv.PrivateKey;
noBroadcast?: boolean;
}): Promise<{
txHex: string;
txid: string;
genesis: string;
codehash: string;
tx: bsv.Transaction;
sensibleId: string;
}>;
/**
* create an unsigned transaction for genesis
* @param tokenName token name, limited to 20 bytes
* @param tokenSymbol the token symbol, limited to 10 bytes
* @param decimalNum the decimal number, range 0-255
* @param utxos (Optional) specify bsv utxos
* @param changeAddress (Optional) specify bsv changeAddress
* @param opreturnData (Optional) append an opReturn output
* @param genesisPublicKey the public key of the token genesiser
* @param noBroadcast (Optional) whether not to broadcast the transaction, the default is false
* @returns
* @returns
*/
unsignGenesis({ tokenName, tokenSymbol, decimalNum, utxos, changeAddress, opreturnData, genesisPublicKey, }: {
tokenName: string;
tokenSymbol: string;
decimalNum: number;
utxos?: ParamUtxo[];
changeAddress?: string | bsv.Address;
opreturnData?: any;
genesisPublicKey: string | bsv.PublicKey;
}): Promise<{
tx: bsv.Transaction;
sigHashList: SigHashInfo[];
}>;
private _genesis;
/**
* Issue tokens.
* @param genesis the genesis of token.
* @param codehash the codehash of token.
* @param sensibleId the sensibleId of token.
* @param genesisWif the private key of the token genesiser
* @param receiverAddress the token receiver address
* @param tokenAmount the token amount to issue
* @param allowIncreaseIssues (Optional) if allow to increase issues.default is true
* @param utxos (Optional) specify bsv utxos
* @param changeAddress (Optional) specify bsv changeAddress
* @param opreturnData (Optional) append an opReturn output
* @param noBroadcast (Optional) whether not to broadcast the transaction, the default is false
* @returns
*/
issue({ genesis, codehash, sensibleId, genesisWif, receiverAddress, tokenAmount, allowIncreaseIssues, utxos, changeAddress, opreturnData, noBroadcast, }: {
genesis: string;
codehash: string;
sensibleId: string;
genesisWif: string;
receiverAddress: string | bsv.Address;
tokenAmount: string | BN;
allowIncreaseIssues: boolean;
utxos?: ParamUtxo[];
changeAddress?: string | bsv.Address;
opreturnData?: any;
noBroadcast?: boolean;
}): Promise<{
txHex: string;
txid: string;
tx: bsv.Transaction;
}>;
/**
* Create the unsigned transaction for issue tokens,
* @param genesis the genesis of token.
* @param codehash the codehash of token.
* @param genesisPublicKey the public key of the token genesiser
* @param receiverAddress the token receiver address
* @param tokenAmount the token amount to issue
* @param allowIncreaseIssues (Optional) if allow to increase issues.default is true
* @param utxos (Optional) specify bsv utxos
* @param changeAddress (Optional) specify bsv changeAddress
* @param opreturnData (Optional) append an opReturn output
* @returns
*/
unsignIssue({ genesis, codehash, sensibleId, genesisPublicKey, receiverAddress, tokenAmount, allowIncreaseIssues, utxos, changeAddress, opreturnData, }: {
genesis: string;
codehash: string;
sensibleId: string;
genesisPublicKey: string | bsv.PublicKey;
receiverAddress: string | bsv.Address;
tokenAmount: string | BN;
allowIncreaseIssues?: boolean;
utxos?: ParamUtxo[];
changeAddress?: string | bsv.Address;
opreturnData?: any;
}): Promise<{
tx: bsv.Transaction;
sigHashList: SigHashInfo[];
}>;
private _getIssueUtxo;
private _prepareIssueUtxo;
private _issue;
/**
* After deciding which ftUxtos to use, perfect the information of FtUtxo
* txHex,preTxId,preOutputIndex,preTxHex,preTokenAddress,preTokenAmount
*/
private perfectFtUtxosInfo;
/**
* Transfer tokens
* @param genesis the genesis of token.
* @param codehash the codehash of token.
* @param receivers token receivers.[{address:'xxx',amount:'1000'}]
* @param senderWif the private key of the token sender,can be wif or other format
* @param ftUtxos (Optional) specify token utxos
* @param ftChangeAddress (Optional) specify ft changeAddress
* @param utxos (Optional) specify bsv utxos which should be no more than 3
* @param changeAddress (Optional) specify bsv changeAddress
* @param middleChangeAddress (Optional) the middle bsv changeAddress
* @param middlePrivateKey (Optional) the private key of the middle changeAddress
* @param isMerge (Optional) do not use this param.Please use function Merge.
* @param opreturnData (Optional) append an opReturn output
* @param noBroadcast (Optional) whether not to broadcast the transaction, the default is false
* @returns
*/
transfer({ codehash, genesis, receivers, senderWif, ftUtxos, ftChangeAddress, utxos, changeAddress, middleChangeAddress, middlePrivateKey, minUtxoSet, isMerge, opreturnData, noBroadcast, }: {
codehash: string;
genesis: string;
receivers?: TokenReceiver[];
senderWif?: string;
ftUtxos?: ParamFtUtxo[];
ftChangeAddress?: string | bsv.Address;
utxos?: ParamUtxo[];
changeAddress?: string | bsv.Address;
middleChangeAddress?: string | bsv.Address;
middlePrivateKey?: string | bsv.PrivateKey;
minUtxoSet?: boolean;
isMerge?: boolean;
opreturnData?: any;
noBroadcast?: boolean;
}): Promise<{
tx: bsv.Transaction;
txHex: string;
txid: string;
routeCheckTx: bsv.Transaction;
routeCheckTxHex: string;
}>;
/**
* create the first part of unsigned transaction to transfer tokens.
* @param genesis the genesis of token.
* @param codehash the codehash of token.
* @param receivers token receivers.[{address:'xxx',amount:'1000'}]
* @param senderPublicKey the public key of the token sender
* @param ftUtxos (Optional) specify token utxos
* @param ftChangeAddress (Optional) specify ft changeAddress
* @param utxos (Optional) specify bsv utxos
* @param changeAddress (Optional) specify bsv changeAddress
* @param middleChangeAddress (Optional) the middle bsv changeAddress
* @param isMerge (Optional) specify if this is a merge
* @param opreturnData (Optional) append an opReturn output
* @returns
*/
unsignPreTransfer({ codehash, genesis, receivers, senderPublicKey, ftUtxos, ftChangeAddress, utxos, changeAddress, isMerge, opreturnData, middleChangeAddress, minUtxoSet, }: {
codehash: string;
genesis: string;
receivers?: TokenReceiver[];
senderPublicKey?: string | bsv.PublicKey;
ftUtxos?: ParamFtUtxo[];
ftChangeAddress?: string | bsv.Address;
utxos?: ParamUtxo[];
changeAddress?: string | bsv.Address;
isMerge?: boolean;
opreturnData?: any;
middleChangeAddress?: string | bsv.Address;
minUtxoSet?: boolean;
}): Promise<{
routeCheckTx: bsv.Transaction;
routeCheckSigHashList: SigHashInfo[];
unsignTxRaw: string;
}>;
unsignTransfer(routeCheckTx: bsv.Transaction, unsignTxRaw: string): Promise<{
tx: bsv.Transaction;
sigHashList: SigHashInfo[];
}>;
private _prepareTransferTokens;
private _transfer;
/**
* Create a transaction for merging tokens, merging up to 20 utxo
* @param genesis the genesis of token.
* @param codehash the codehash of token.
* @param ownerWif the private key of the token owner,can be wif or other format
* @param utxos (Optional) specify bsv utxos which should be no more than 3
* @param changeAddress (Optional) specify bsv changeAddress
* @param opreturnData (Optional) append an opReturn output
* @param noBroadcast (Optional) whether not to broadcast the transaction, the default is false
* @returns
*/
merge({ codehash, genesis, ownerWif, utxos, changeAddress, noBroadcast, opreturnData, }: {
codehash: string;
genesis: string;
ownerWif: string;
utxos?: ParamUtxo[];
changeAddress?: string | bsv.Address;
noBroadcast?: boolean;
opreturnData?: any;
}): Promise<{
tx: bsv.Transaction;
txHex: string;
txid: string;
routeCheckTx: bsv.Transaction;
routeCheckTxHex: string;
}>;
/**
* Create the first part of the unsigned transaction for merging tokens, merging up to 20 utxo
* @param genesis the genesis of token.
* @param codehash the codehash of token.
* @param ownerPublicKey the public key of the token owner,can be string or other valid format
* @param ftUtxos (Optional) specify token utxos
* @param ftChangeAddress (Optional) specify token changeAddress
* @param utxos (Optional) specify bsv utxos
* @param changeAddress (Optional) specify bsv changeAddress
* @param opreturnData (Optional) append an opReturn output
* @returns
*/
unsignPreMerge({ codehash, genesis, ownerPublicKey, ftUtxos, ftChangeAddress, utxos, changeAddress, opreturnData, }: {
codehash: string;
genesis: string;
ownerPublicKey: string | bsv.PublicKey;
ftUtxos?: ParamFtUtxo[];
ftChangeAddress?: string | bsv.Address;
utxos?: ParamUtxo[];
changeAddress?: string | bsv.Address;
opreturnData?: any;
}): Promise<{
routeCheckTx: bsv.Transaction;
routeCheckSigHashList: Utils.SigHashInfo[];
unsignTxRaw: string;
}>;
unsignMerge(routeCheckTx: bsv.Transaction, unsignTxRaw: string): Promise<{
tx: bsv.Transaction;
sigHashList: SigHashInfo[];
}>;
/**
* Query token balance
* @param codehash
* @param genesis
* @param address
* @returns
*/
getBalance({ codehash, genesis, address, }: {
codehash: string;
genesis: string;
address: string;
}): Promise<string>;
/**
* Query token balance detail
* @param codehash
* @param genesis
* @param address
* @returns
*/
getBalanceDetail({ codehash, genesis, address, }: {
codehash: string;
genesis: string;
address: string;
}): Promise<{
balance: string;
pendingBalance: string;
utxoCount: number;
decimal: number;
}>;
/**
* Query the Token list under this address. Get the balance of each token
* @param address
* @returns
*/
getSummary(address: string): Promise<import("../sensible-api").FungibleTokenSummary[]>;
/**
* Estimate the cost of genesis
* @param opreturnData
* @param utxoMaxCount Maximum number of BSV UTXOs supported
* @returns
*/
getGenesisEstimateFee({ opreturnData, utxoMaxCount, }: {
opreturnData?: any;
utxoMaxCount?: number;
}): Promise<number>;
/**
* Estimate the cost of issue
* The minimum cost required in the case of 10 utxo inputs .
* @param sensibleId
* @param genesisPublicKey
* @param opreturnData
* @param utxoMaxCount Maximum number of BSV UTXOs supported
* @returns
*/
getIssueEstimateFee({ sensibleId, genesisPublicKey, opreturnData, allowIncreaseIssues, utxoMaxCount, }: {
sensibleId: string;
genesisPublicKey: string | bsv.PublicKey;
opreturnData?: any;
allowIncreaseIssues: boolean;
utxoMaxCount?: number;
}): Promise<number>;
private _calIssueEstimateFee;
/**
* Estimate the cost of transfer
*/
getTransferEstimateFee({ codehash, genesis, receivers, senderWif, senderPrivateKey, senderPublicKey, ftUtxos, ftChangeAddress, isMerge, opreturnData, utxoMaxCount, minUtxoSet, }: {
codehash: string;
genesis: string;
receivers?: TokenReceiver[];
senderWif?: string;
senderPrivateKey?: string | bsv.PrivateKey;
senderPublicKey?: string | bsv.PublicKey;
ftUtxos?: ParamFtUtxo[];
ftChangeAddress?: string | bsv.Address;
isMerge?: boolean;
opreturnData?: any;
utxoMaxCount?: number;
minUtxoSet?: boolean;
}): Promise<number>;
/**
* Estimate the cost of merge
*/
getMergeEstimateFee({ codehash, genesis, ownerWif, ownerPublicKey, ftUtxos, ftChangeAddress, opreturnData, utxoMaxCount, minUtxoSet, }: {
codehash: string;
genesis: string;
ownerWif?: string;
ownerPublicKey?: string | bsv.PublicKey;
ftUtxos?: ParamFtUtxo[];
ftChangeAddress?: string | bsv.Address;
opreturnData?: any;
utxoMaxCount?: number;
minUtxoSet?: boolean;
}): Promise<number>;
/**
* Update the signature of the transaction
* @param tx
* @param sigHashList
* @param sigList
*/
sign(tx: bsv.Transaction, sigHashList: SigHashInfo[], sigList: SigInfo[]): void;
/**
* Broadcast a transaction
* @param txHex
*/
broadcast(txHex: string): Promise<string>;
private _calTransferEstimateFee;
/**
* Estimate the cost of transfer
*/
getTransferEstimateFee2({ bsvInputLen, tokenInputLen, tokenOutputLen, opreturnData, }: {
bsvInputLen: number;
tokenInputLen: number;
tokenOutputLen: number;
opreturnData?: any;
}): Promise<number>;
/**
* Print tx
* @param tx
*/
dumpTx(tx: bsv.Transaction): void;
/**
* Query token's utxos
* @param codehash
* @param genesis
* @param address
* @param count
* @returns
*/
getFtUtxos(codehash: string, genesis: string, address: string, count?: number): Promise<FungibleTokenUnspent[]>;
/**
* Check if codehash is supported
* @param codehash
* @returns
*/
static isSupportedToken(codehash: string): boolean;
/**
* Check if codehash and sensibleID is supported
* @param codehash
* @param sensibleId
* @returns
*/
isSupportedToken(codehash: string, sensibleId: string): Promise<boolean>;
/**
* Get codehash and genesis from genesis tx.
* @param genesisTx genesis tx
* @param genesisOutputIndex (Optional) outputIndex - default value is 0.
* @returns
*/
getCodehashAndGensisByTx(genesisTx: bsv.Transaction, genesisOutputIndex?: number): {
codehash: string;
genesis: string;
sensibleId: string;
};
private _checkTxFeeRate;
/**
* parse a output script to get Token info
* @param scriptBuf
* @param network
* @returns
*/
static parseTokenScript(scriptBuf: Buffer, network?: API_NET): {
codehash: string;
genesis: string;
sensibleId: string;
tokenName: string;
tokenSymbol: string;
genesisFlag: number;
decimalNum: number;
tokenAddress: string;
tokenAmount: BN;
genesisHash: string;
rabinPubKeyHashArrayHash: string;
sensibleID: ftProto.SensibleID;
protoVersion: number;
protoType: number;
};
}
export {};