Reserved IP Address°C
01-22-2025
BSV
$52.64
Vol 36.84m
2.88%
BTC
$105552
Vol 74004.66m
3.5%
BCH
$448.13
Vol 216.82m
5.96%
LTC
$117.38
Vol 869.7m
1.69%
DOGE
$0.37
Vol 8266.71m
8.07%
Getting your Trinity Audio player ready...

This post was first published on Medium, and we republished with permission from the sCrypt team. YusufIdiMaina. Connect with the post’s author, Yusuf Idi Maina, on LinkedIn.

Bitcoin smart contracts possess the capability to determine the validity of satoshis within a UTXO, yet they face limitations when verifying the presence and quantity of 1SatOrdinals tokens in a UTXO. While on-chain miners can validate the number of satoshis, Ordinals tokens and specific NFTs are validated by an external indexer off-chain, which presents challenges in various applications such as token swaps and sales. To address this, oracles are introduced to ensure the authenticity and integrity of Ordinals tokens required when invoking a contract.

This tutorial will guide you through the process of using the WitnessOnChain oracle to validate transaction inputs referencing UTXOs containing Ordinals NFTs and BSV20 tokens.

WitnessOnChain API

The WitnessOnChain oracle offers an API to retrieve inscription details from an outpoint:

https://api.witnessonchain.com/v1/inscription/bsv/{network}/outpoint/{txid}/{vout}

API Response Structure

The response from the API is a signed message with the following structure:

Code image

Custom Type Definition and Parser Function

Based on this structure, we define a custom type `Msg` and a helper parser function to decode the message.

Code screenshot image

Implementing the Contract

In this section, we implement a demonstration contract that is successfully invoked only when the second input (input #1) of the spending transaction contains a specific amount of a certain BSV20 token.

Chart image screenshot

To verify the oracle’s signed message, the oracle’s public key must be included in the contract. Additionally, to record the specific BSV20 token and its amount, we introduce two additional properties.

Code screenshot from website

Methods

The public `unlock` method requires three parameters:

1. `msg`: The oracle’s signed message.
2. `sig`: The oracle’s signature.
3. `tokenInputIndex`: An index marking which input is the token input.

Code screenshot

We first retrieve the token outpoint from `this.prevouts`. We then parse the message signed by the oracle and verify it against the outpoint. With this verification, we can confidently use the token information, such as amount and ID, in the remaining contract code.

Conclusion

Congratulations! You have successfully completed a tutorial on validating 1SatOrdinals inputs with an oracle. This process enhances the security and reliability of smart contracts dealing with Ordinals tokens and NFTs by leveraging external validation mechanisms.

For a full example contract and its corresponding test, please refer to our boilerplate repo.

Watch: sCrypt Hackathon 2024 (16th March 2024, AM)

Recommended for you

Cambodia advances blockchain framework; Guangzhou boosts CBDC adoption
Elsewhere, the city of Guangzhou in China has launched a new drive to expand digital yuan payments, including in public...
January 22, 2025
BRICS vs. USD: How blockchain can create prosperity, peace
The dominance of USD is facing competition from BRICS, an intergovernmental organization that accounts for 35% of global GDP, and...
January 21, 2025
Advertisement
Advertisement
Advertisement