meta-contract
Version:
Meta Contract SDK
354 lines (353 loc) • 12.2 kB
TypeScript
/// <reference types="node" />
import { Bytes } from '../scryptlib';
import * as mvc from '../mvc';
import { Api, API_NET, API_TARGET } from '..';
import * as BN from '../bn.js';
import * as ftProto from './contract-proto/token.proto';
import { FungibleTokenUnspent } from '../api';
import { Buffer } from 'buffer';
export declare const sighashType: number;
type ParamUtxo = {
txId: string;
outputIndex: number;
satoshis: number;
wif?: string;
address?: string | mvc.Address;
};
type Mcp02Options = {
network?: API_NET;
apiTarget?: API_TARGET;
apiHost?: string;
purse?: string;
feeb?: number;
dustLimitFactor?: number;
dustAmount?: number;
debug?: boolean;
};
type TokenReceiver = {
address: string;
amount: string;
};
type ParamFtUtxo = {
txId: string;
outputIndex: number;
tokenAddress: string;
tokenAmount: string;
wif?: string;
};
export declare class FtManager {
private network;
private _api;
private zeroAddress;
private purse;
private feeb;
private dustCalculator?;
transferCheckCodeHashArray: Bytes[];
unlockContractCodeHashArray: Bytes[];
private debug;
get api(): Api;
get sensibleApi(): Api;
constructor({ network, apiTarget, purse, feeb, apiHost, dustLimitFactor, dustAmount, debug, }: Mcp02Options);
/**
* 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 mvc utxos
* @param changeAddress (Optional) specify mvc 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({ version, tokenName, tokenSymbol, decimalNum, utxos: utxosInput, changeAddress, opreturnData, genesisWif, noBroadcast, }: {
version?: number;
tokenName: string;
tokenSymbol: string;
decimalNum: number;
utxos?: any[];
changeAddress?: string | mvc.Address;
opreturnData?: any;
genesisWif?: string;
noBroadcast?: boolean;
}): Promise<{
txHex: string;
txid: string;
tx: mvc.Transaction;
codehash: string;
genesis: string;
sensibleId: string;
}>;
issue(options: {
genesis: string;
codehash: string;
sensibleId: string;
genesisWif: string;
receiverAddress: string | mvc.Address;
tokenAmount: string | BN;
allowIncreaseMints: boolean;
utxos?: ParamUtxo[];
changeAddress?: string | mvc.Address;
opreturnData?: any;
noBroadcast?: boolean;
}): Promise<{
txHex: string;
txid: string;
tx: mvc.Transaction;
}>;
mint({ version, sensibleId, genesisWif, receiverAddress, tokenAmount, allowIncreaseMints, utxos, changeAddress, opreturnData, noBroadcast, }: {
version?: number;
sensibleId: string;
genesisWif: string;
receiverAddress: string | mvc.Address;
tokenAmount: string | BN;
allowIncreaseMints?: boolean;
utxos?: ParamUtxo[];
changeAddress?: string | mvc.Address;
opreturnData?: any;
noBroadcast?: boolean;
}): Promise<{
txHex: string;
txid: string;
tx: mvc.Transaction;
}>;
private _mint;
private _prepareMintUtxo;
private _getMintUtxo;
private _calMintEstimateFee;
merge({ codehash, genesis, ownerWif, utxos, changeAddress, noBroadcast, opreturnData, }: {
codehash: string;
genesis: string;
ownerWif?: string;
utxos?: ParamUtxo[];
changeAddress?: string | mvc.Address;
noBroadcast?: boolean;
opreturnData?: any;
}): Promise<{
tx: mvc.Transaction;
txHex: string;
txid: string;
routeCheckTx: mvc.Transaction;
routeCheckTxHex: string;
}>;
totalMerge({ codehash, genesis, ownerWif, changeAddress, opreturnData, }: {
codehash: string;
genesis: string;
ownerWif?: string;
changeAddress?: string | mvc.Address;
opreturnData?: any;
}): Promise<{
txids: string[];
}>;
private _pretreatUtxos;
/**
* Estimate the cost of genesis
* @param opreturnData
* @param utxoMaxCount Maximum number of MVC UTXOs supported
* @returns
*/
getGenesisEstimateFee({ opreturnData, utxoMaxCount, }: {
opreturnData?: any;
utxoMaxCount?: number;
}): Promise<number>;
private _genesis;
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 | mvc.Address;
utxos?: ParamUtxo[];
changeAddress?: string | mvc.Address;
middleChangeAddress?: string | mvc.Address;
middlePrivateKey?: string | mvc.PrivateKey;
minUtxoSet?: boolean;
isMerge?: boolean;
opreturnData?: any;
noBroadcast?: boolean;
}): Promise<{
tx: mvc.Transaction;
txHex: string;
txid: string;
routeCheckTx: mvc.Transaction;
routeCheckTxHex: string;
}>;
/**
* burn token
* @param codehash token codehash
* @param genesis token genesis
* @param ftUtxos ft utxos to burn, must be sent to zero address
* @param utxos fee provider utxos
* @param utxoPrivateKey fee provider utxo private key
* @param changeAddress satoshi change address
* @param opreturnData opreturn data
* @param noBroadcast if true, will not broadcast tx
*/
burn({ codehash, genesis, ftUtxos, utxos, utxoPrivateKey, changeAddress, opreturnData, noBroadcast, }: {
codehash: string;
genesis: string;
ftUtxos?: ParamFtUtxo[];
utxos?: ParamUtxo[];
utxoPrivateKey?: string | mvc.PrivateKey;
changeAddress?: string | mvc.Address;
opreturnData?: any;
noBroadcast?: boolean;
}): Promise<{
tx: mvc.Transaction;
txHex: string;
txid: string;
routeCheckTx: mvc.Transaction;
routeCheckTxHex: string;
}>;
private _pretreatFtUtxos;
/**
* prepare transfer tokens, decide which transfer pattern to use, preprocess ft utxos(fetch previous transactions for tx building)
* @param codehash codehash of token
* @param genesis genesis of token
* @param receivers token receivers, will be ignored if isMerge is true
* @param ftUtxos input ft utxos
* @param ftChangeAddress change address of ft
* @param isMerge merge utxos, if true, all the token will be merged into one utxo and send to the change address
* @param minUtxoSet if true, will use minimum utxo set as possible
* @private
*/
private _prepareTransferTokens;
/**
* prepare burn tokens,preprocess ft utxos(fetch previous transactions for tx building)
* @param codehash codehash of token
* @param genesis genesis of token
* @param ftUtxos input ft utxos
* @private
*/
private _prepareBurnTokens;
/**
* Fetch previous transactions for each ft utxo
* @param ftUtxos ft utxos
* @param genesis genesis of token
* @private
*/
private perfectFtUtxosInfo;
/**
* composite a token transfer transaction and amount check transaction
* @param codehash codehash of the token
* @param genesis genesis of the token
* @param receivers token receivers
* @param ftUtxos input ftUtxos
* @param ftPrivateKeys private keys of ftUtxos
* @param ftChangeAddress change address of ftUtxos
* @param utxos utxos for paying fee
* @param utxoPrivateKeys private keys of utxos(fee paying)
* @param changeAddress change address of utxos(fee paying)
* @param middlePrivateKey
* @param middleChangeAddress
* @param isMerge whether to merge the token utxos
* @param opreturnData opreturn data to be added to the transaction
* @param minUtxoSet
* @private
*/
private _transfer;
/**
* burn the provided ft utxos, the utxo must be sent to the zero address in order to burn
* @param codehash codehash of the token
* @param genesis genesis of the token
* @param ftUtxos ft utxos to burn(must be transferred to the zero address)
* @param utxos utxos to pay the fee
* @param utxoPrivateKey private keys of the utxos(fee paying utxos)
* @param changeAddress the address to receive the change satoshis
* @param opreturnData opreturn data
* @private
* @returns {Promise<{transferCheckTxComposer: TxComposer, txComposer: TxComposer}>}
*/
private _burn;
/**
* calculate transfer fee for ft transfer
* @param p2pkhInputNum
* @param tokenInputArray
* @param tokenOutputArray
* @param tokenTransferType
* @param opreturnData
* @private
*/
private _calTransferEstimateFee;
/**
* calculate transfer fee for ft burn
* this includes the fee for transfer check tx
* @param p2pkhInputNum
* @param tokenInputArray
* @param opreturnData
* @param tokenUnlockType
* @private
*/
private _calBurnEstimateFee;
private getDustThreshold;
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("../api").FungibleTokenSummary[]>;
getFtUtxos(codehash: string, genesis: string, address: string, count?: number): Promise<FungibleTokenUnspent[]>;
getMergeEstimateFee({ codehash, genesis, ownerWif, ownerPublicKey, ftUtxos, ftChangeAddress, opreturnData, utxoMaxCount, minUtxoSet, }: {
codehash: string;
genesis: string;
ownerWif?: string;
ownerPublicKey?: string | mvc.PublicKey;
ftUtxos?: ParamFtUtxo[];
ftChangeAddress?: string | mvc.Address;
opreturnData?: any;
utxoMaxCount?: number;
minUtxoSet?: boolean;
}): Promise<number>;
getTransferEstimateFee({ codehash, genesis, receivers, senderWif, senderPrivateKey, senderPublicKey, ftUtxos, ftChangeAddress, isMerge, opreturnData, utxoMaxCount, minUtxoSet, }: {
codehash: string;
genesis: string;
receivers?: TokenReceiver[];
senderWif?: string;
senderPrivateKey?: string | mvc.PrivateKey;
senderPublicKey?: string | mvc.PublicKey;
ftUtxos?: ParamFtUtxo[];
ftChangeAddress?: string | mvc.Address;
isMerge?: boolean;
opreturnData?: any;
utxoMaxCount?: number;
minUtxoSet?: boolean;
}): Promise<number>;
static parseTokenScript(scriptBuf: Buffer, network?: API_NET): {
codehash: string;
genesis: string;
sensibleId: string;
tokenName: string;
tokenSymbol: string;
decimalNum: number;
tokenAddress: string;
tokenAmount: any;
genesisHash: string;
sensibleID: ftProto.SensibleID;
protoVersion: number;
protoType: number;
};
}
export {};