SmartContract
scrypt-ts / SmartContract
Class: SmartContract
The main contract class. To write a contract, extend this class as such:
Example
class YourSmartContract extends SmartContract {
// your smart contract code here
}
Table of contents
Constructors
Properties
Accessors
- asmArgs
- balance
- changeAddress
- changeAmount
- codePart
- ctx
- dataPart
- debug
- lockingScript
- methods
- prevouts
- provider
- scriptHash
- scriptSize
- signer
- utxo
Other Methods
- bindTxBuilder
- buildChangeOutput
- buildContractInput
- buildDeployTransaction
- buildStateOutput
- checkPreimage
- checkPreimageAdvanced
- checkPreimageSigHashType
- connect
- deploy
- getStateScript
- insertCodeSeparator
- isStateful
- markAsGenesis
- next
- setAsmVars
- setDataPartInASM
- setDataPartInHex
- sigTypeOfMethod
- compile
- fromTx
- getArtifact
- loadArtifact
- multiContractCall
- parseCallData
Signature Verification Methods
Constructors
constructor
• new SmartContract(...args)
Parameters
| Name | Type |
|---|---|
...args | any[] |
Defined in
dist/smart-contract/contract.d.ts:149
Properties
call
• Private call: any
Defined in
dist/smart-contract/contract.d.ts:422
dummySignSingleCallTx
• Private dummySignSingleCallTx: any
Defined in
dist/smart-contract/contract.d.ts:426
from
• Optional from: IUnspentOutput | TxOutputRef
from is a reference to a transaction output where the props of this contract instance are located/stored on chain.
In other words, it's the start point for the lifecycle of this instance.
Defined in
dist/smart-contract/contract.d.ts:100
hasPrevouts
• Private hasPrevouts: any
Defined in
dist/smart-contract/contract.d.ts:317
multiContractCall
• Private multiContractCall: any
Defined in
dist/smart-contract/contract.d.ts:424
signSingleCallTx
• Private signSingleCallTx: any
Defined in
dist/smart-contract/contract.d.ts:425
singleContractCall
• Private singleContractCall: any
Defined in
dist/smart-contract/contract.d.ts:423
to
• Optional to: TxInputRef
to is a reference to a transaction input where a public method of this contract instance is called.
In other words, it's the end point for the lifecycle of this instance.
Defined in
dist/smart-contract/contract.d.ts:105
Accessors
asmArgs
• get asmArgs(): AsmVarValues
Returns set ASM variable values.
Returns
AsmVarValues
Defined in
dist/smart-contract/contract.d.ts:201
balance
• get balance(): number
Get the current locked balance of the contract
Returns
number
Defined in
dist/smart-contract/contract.d.ts:471
changeAddress
• get changeAddress(): Ripemd160
Get the change address of the change output for to.tx.
Onchain
Returns
Ripemd160
the change address of to.tx
Defined in
dist/smart-contract/contract.d.ts:304
changeAmount
• get changeAmount(): bigint
Get the amount of the change output for to.tx.
Onchain
Returns
bigint
amount in satoshis
Defined in
dist/smart-contract/contract.d.ts:292
codePart
• get codePart(): string
Returns code part of the lockingScript, in hex format.
Returns
string
Defined in
dist/smart-contract/contract.d.ts:186
ctx
• get ctx(): ScriptContext
You can directly access the context through this.ctx in any public @method.
[ScriptContext][https://docs.scrypt.io/how-to-write-a-contract/scriptcontext](https://docs.scrypt.io/how-to-write-a-contract/scriptcontext) can be considered additional information a public method gets when called, besides its function parameters.
Onchain
Returns
Defined in
dist/smart-contract/contract.d.ts:481
dataPart
• get dataPart(): Script
Returns
Defined in
dist/smart-contract/contract.d.ts:354
debug
• get debug(): DebugFunctions
A set of functions for debugging contracts, which can only be called in @method methods.
Returns
DebugFunctions
Defined in
dist/smart-contract/contract.d.ts:467
lockingScript
• get lockingScript(): Script
Returns a lockingScript of contract.
Returns
Defined in
dist/smart-contract/contract.d.ts:178
methods
• get methods(): Record<string, (...args: any) => Promise<ContractTransaction>>
An object to access all public @methods
Returns
Record<string, (...args: any) => Promise<ContractTransaction>>
Defined in
dist/smart-contract/contract.d.ts:430
prevouts
• get prevouts(): ByteString
Get the prevouts for to.tx.
Onchain
Returns
prevouts in satoshis
Defined in
dist/smart-contract/contract.d.ts:298
provider
• get provider(): Provider
Get the connected [provider][https://docs.scrypt.io/how-to-test-a-contract#provider](https://docs.scrypt.io/how-to-test-a-contract#provider)
Returns
Defined in
dist/smart-contract/contract.d.ts:379
scriptHash
• get scriptHash(): string
Returns sha256 hash of the current locking script, formatted as a LE hex string.
Returns
string
Defined in
dist/smart-contract/contract.d.ts:190
scriptSize
• get scriptSize(): number
Returns script size of lockingScript.
Returns
number
Defined in
dist/smart-contract/contract.d.ts:182
signer
• get signer(): Signer
Get the connected [signer][https://docs.scrypt.io/how-to-test-a-contract#signer](https://docs.scrypt.io/how-to-test-a-contract#signer)
Returns
Defined in
dist/smart-contract/contract.d.ts:375
utxo
• get utxo(): IUnspentOutput
Get the utxo where the contract is currently located
Returns
Defined in
dist/smart-contract/contract.d.ts:475
Other Methods
bindTxBuilder
▸ bindTxBuilder(methodName, txBuilder): void
Bind a transation builder for a public @method
Parameters
| Name | Type | Description |
|---|---|---|
methodName | string | the public @method name |
txBuilder | MethodCallTxBuilder<SmartContract> | a transation builder |
Returns
void
Defined in
dist/smart-contract/contract.d.ts:438
buildChangeOutput
▸ buildChangeOutput(): ByteString
A built-in function to create an [change output][https://wiki.bitcoinsv.io/index.php/Change](https://wiki.bitcoinsv.io/index.php/Change).
Onchain
Returns
Defined in
dist/smart-contract/contract.d.ts:233
buildContractInput
▸ buildContractInput(fromUTXO?): Input
Build an input that includes the contract
Parameters
| Name | Type | Description |
|---|---|---|
fromUTXO? | IUnspentOutput | A parameter to specify the utxo where the contract is located |
Returns
an input that includes the contract
Defined in
dist/smart-contract/contract.d.ts:448
buildDeployTransaction
▸ buildDeployTransaction(utxos, amount, changeAddress): Promise<Transaction>
creates a tx to deploy the contract. Users override it to cutomize a deployment tx as below.
Example
override async buildDeployTransaction(utxos: UTXO[], amount: number, changeAddress?: bsv.Address | string): Promise<bsv.Transaction> {
const deployTx = new bsv.Transaction()
// add p2pkh inputs for paying tx fees
.from(utxos)
// add contract output
.addOutput(new bsv.Transaction.Output({
script: this.lockingScript,
satoshis: amount,
}))
// add the change output if passing `changeAddress`
if (changeAddress) {
deployTx.change(changeAddress);
if (this._provider) {
deployTx.feePerKb(await this.provider.getFeePerKb());
}
}
return deployTx;
}
Parameters
| Name | Type | Description |
|---|---|---|
utxos | IUnspentOutput[] | represents one or more P2PKH inputs for paying transaction fees. |
amount | number | the balance of contract output |
changeAddress | string | Address | a change address |
Returns
Promise<Transaction>
Defined in
dist/smart-contract/contract.d.ts:409
buildStateOutput
▸ buildStateOutput(amount): ByteString
A built-in function to create an output containing the new state. It takes an input: the number of satoshis in the output.
Onchain
Parameters
| Name | Type | Description |
|---|---|---|
amount | bigint | the number of satoshis in the output |
Returns
an output containing the new state
Defined in
dist/smart-contract/contract.d.ts:227
checkPreimage
▸ checkPreimage(txPreimage): boolean
Using the [OP_PUSH_TX][https://medium.com/@xiaohuiliu/op-push-tx-3d3d279174c1](https://medium.com/@xiaohuiliu/op-push-tx-3d3d279174c1) technique, check if txPreimage is the preimage of the current transaction.
Onchain
Parameters
| Name | Type | Description |
|---|---|---|
txPreimage | SigHashPreimage | The format of the preimage is [specified][https://github.com/bitcoin-sv/bitcoin-sv/blob/master/doc/abc/replay-protected-sighash.md#digest-algorithm](https://github.com/bitcoin-sv/bitcoin-sv/blob/master/doc/abc/replay-protected-sighash.md#digest-algorithm) |
Returns
boolean
true if txPreimage is the preimage of the current transaction. Otherwise false.
Defined in
dist/smart-contract/contract.d.ts:274
checkPreimageAdvanced
▸ checkPreimageAdvanced(txPreimage, privKey, pubKey, inverseK, r, rBigEndian, sigHashType): boolean
Same as checkPreimage, but support customized more settings.
Onchain
Parameters
| Name | Type | Description |
|---|---|---|
txPreimage | SigHashPreimage | The format of the preimage is [specified][https://github.com/bitcoin-sv/bitcoin-sv/blob/master/doc/abc/replay-protected-sighash.md#digest-algorithm](https://github.com/bitcoin-sv/bitcoin-sv/blob/master/doc/abc/replay-protected-sighash.md#digest-algorithm) |
privKey | PrivKey | private Key |
pubKey | PubKey | public key |
inverseK | bigint | inverseK |
r | bigint | r |
rBigEndian | string | must be mininally encoded, to conform to strict DER rule https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki#der-encoding |
sigHashType | SigHashType | A SIGHASH flag is used to indicate which part of the transaction is signed by the ECDSA signature. |
Returns
boolean
true if txPreimage is the preimage of the current transaction. Otherwise false.
Defined in
dist/smart-contract/contract.d.ts:259
checkPreimageSigHashType
▸ checkPreimageSigHashType(txPreimage, sigHashType): boolean
Same as checkPreimage, but support customized sighash type
Onchain
Parameters
| Name | Type | Description |
|---|---|---|
txPreimage | SigHashPreimage | The format of the preimage is [specified][https://github.com/bitcoin-sv/bitcoin-sv/blob/master/doc/abc/replay-protected-sighash.md#digest-algorithm](https://github.com/bitcoin-sv/bitcoin-sv/blob/master/doc/abc/replay-protected-sighash.md#digest-algorithm) |
sigHashType | SigHashType | A SIGHASH flag is used to indicate which part of the transaction is signed by the ECDSA signature. |
Returns
boolean
true if txPreimage is the preimage of the current transaction. Otherwise false.
Defined in
dist/smart-contract/contract.d.ts:267
connect
▸ connect(providerOrSigner): Promise<void>
connect a provider or a signer.
Parameters
| Name | Type | Description |
|---|---|---|
providerOrSigner | Provider | Signer | a provider or a signer |
Returns
Promise<void>
Defined in
dist/smart-contract/contract.d.ts:371
deploy
▸ deploy(amount?, options?): Promise<TransactionResponse>
Deploy the contract
Parameters
| Name | Type | Description |
|---|---|---|
amount? | number | satoshis locked in the contract, 1 sat by default |
options? | Object | An optional parameter that can specify the change address |
options.address? | Address | - |
options.changeAddress? | Address | - |
Returns
Promise<TransactionResponse>
The transaction id of the successfully deployed contract
Defined in
dist/smart-contract/contract.d.ts:416
getStateScript
▸ getStateScript(): ByteString
A built-in function to create a locking script containing the new state.
Onchain
Returns
a locking script that containing the new state
Defined in
dist/smart-contract/contract.d.ts:239
insertCodeSeparator
▸ insertCodeSeparator(): void
Insert and OP_CODESEPARATOR at this point of the functions logic. More detail about [OP_CODESEPARATOR][https://wiki.bitcoinsv.io/index.php/OP_CODESEPARATOR](https://wiki.bitcoinsv.io/index.php/OP_CODESEPARATOR)
Returns
void
Defined in
dist/smart-contract/contract.d.ts:279
isStateful
▸ isStateful(): boolean
Check if the contract is a stateful contract
Returns
boolean
true if contract has a @prop(true) property
Defined in
dist/smart-contract/contract.d.ts:453
markAsGenesis
▸ markAsGenesis(): SmartContract
Mark the contract as genesis contracts
Returns
Defined in
dist/smart-contract/contract.d.ts:220
next
▸ next(opt?): SmartContract
Parameters
| Name | Type | Description |
|---|---|---|
opt? | Object | properties that only references are copied, but not deep clone their values. |
opt.refCloneProps? | string[] | - |
Returns
a cloned contract instance with this.from = undefined and this.to = undefined
Defined in
dist/smart-contract/contract.d.ts:214
setAsmVars
▸ setAsmVars(asmVarValues): void
If the compiled contract contains any ASM variable templates (e.g. P2PKH.unlock.pubKeyHash), replace them with the passed values.
Parameters
| Name | Type | Description |
|---|---|---|
asmVarValues | AsmVarValues | type that contains the actual values. |
Returns
void
Defined in
dist/smart-contract/contract.d.ts:197
setDataPartInASM
▸ setDataPartInASM(dataPart): void
set the data part of the contract in ASM format
Parameters
| Name | Type |
|---|---|
dataPart | string |
Returns
void
Defined in
dist/smart-contract/contract.d.ts:348
setDataPartInHex
▸ setDataPartInHex(dataPart): void
set the data part of the contract in hex format
Parameters
| Name | Type |
|---|---|
dataPart | string |
Returns
void
Defined in
dist/smart-contract/contract.d.ts:353
sigTypeOfMethod
▸ sigTypeOfMethod(methodName): number
Get [sigHash type][https://docs.scrypt.io/how-to-write-a-contract/scriptcontext#sighash-type](https://docs.scrypt.io/how-to-write-a-contract/scriptcontext#sighash-type) of the public @method function.
Parameters
| Name | Type | Description |
|---|---|---|
methodName | string | name of the public @method function. |
Returns
number
a sigHash type
Defined in
dist/smart-contract/contract.d.ts:459
compile
▸ Static compile(): Promise<Artifact>
compiling the scrypt source which is the output of transpiling. Calling this function to output the contract artifact file. only used for testing. This function should not be called in production environment.
Returns
Promise<Artifact>
if compiling succeed, otherwise it throws error.
Defined in
dist/smart-contract/contract.d.ts:124
fromTx
▸ Static fromTx<T>(this, tx, atOutputIndex, offchainValues?): T
recover a SmartContract instance from the transaction
if the contract contains onchain properties of type HashedMap or HashedSet
it's required to pass all their offchain raw data at this transaction moment
Type parameters
| Name | Type |
|---|---|
T | extends SmartContract<T> |
Parameters
| Name | Type | Description |
|---|---|---|
this | (...args: any[]) => T | - |
tx | Transaction | transaction |
atOutputIndex | number | output index of tx |
offchainValues? | Record<string, any> | the value of offchain properties, the raw data of onchain HashedMap and HashedSet properties, at this transaction moment |
Returns
T
Defined in
dist/smart-contract/contract.d.ts:499
getArtifact
▸ Static getArtifact(): Artifact
The contract class needs to call this function before instantiating.
Returns
Defined in
dist/smart-contract/contract.d.ts:138
loadArtifact
▸ Static loadArtifact(artifactFile?): void
This function is usually called on the front-end. The contract class needs to call this function before instantiating.
Parameters
| Name | Type | Description |
|---|---|---|
artifactFile? | string | Artifact | a merged contract artifact object, or its file path |
Returns
void
Defined in
dist/smart-contract/contract.d.ts:132
multiContractCall
▸ Static multiContractCall(partialContractTx, signer, options?): Promise<MultiContractTransaction>
When the @methods of multiple contracts is called in a transaction, this function signs and broadcasts the final transaction.
Parameters
| Name | Type | Description |
|---|---|---|
partialContractTx | ContractTransaction | a ContractTransation with a unsigned transation. |
signer | Signer | a signer to sign the transation. |
options? | MultiContractCallOptions | - |
Returns
Promise<MultiContractTransaction>
a MultiContractTransation with a signed transation.
Defined in
dist/smart-contract/contract.d.ts:510
parseCallData
▸ Static parseCallData(tx, inputIndex): CallData
parse call data when a contract public method called in a transation.
Parameters
| Name | Type |
|---|---|
tx | Transaction |
inputIndex | number |
Returns
CallData
Defined in
dist/smart-contract/contract.d.ts:517
Signature Verification Methods
checkMultiSig
▸ checkMultiSig(signatures, publickeys): boolean
Compares the first signature against each public key until it finds an ECDSA match. Starting with the subsequent public key, it compares the second signature against each remaining public key until it finds an ECDSA match. The process is repeated until all signatures have been checked or not enough public keys remain to produce a successful result. All signatures need to match a public key. Because public keys are not checked again if they fail any signature comparison, signatures must be placed in the scriptSig using the same order as their corresponding public keys were placed in the scriptPubKey or redeemScript. If all signatures are valid, 1 is returned, 0 otherwise. Due to a bug, one extra unused value is removed from the stack.
Onchain
See
https://wiki.bitcoinsv.io/index.php/Opcodes_used_in_Bitcoin_Script
Parameters
| Name | Type |
|---|---|
signatures | Sig[] |
publickeys | PubKey[] |
Returns
boolean
Defined in
dist/smart-contract/contract.d.ts:286
checkSig
▸ checkSig(signature, publickey, errorMsg?): boolean
A built-in function verifies an ECDSA signature. It takes two inputs from the stack, a public key (on top of the stack) and an ECDSA signature in its DER_CANONISED format concatenated with sighash flags. It outputs true or false on the stack based on whether the signature check passes or fails.
Onchain
See
https://wiki.bitcoinsv.io/index.php/Opcodes_used_in_Bitcoin_Script
Parameters
| Name | Type |
|---|---|
signature | Sig |
publickey | PubKey |
errorMsg? | string |
Returns
boolean
Defined in
dist/smart-contract/contract.d.ts:246