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 @method
s
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 @method
s 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