Join 98,437 users already on

«Is it an SLP transaction?» using Python

0 152
Avatar for cashdev
Written by   40
2 years ago

Here is a quick and crude way to check if an transaction is likely an SLP transaction. It can be a transaction that sends a SLP token, creates one, mints more or whatever.

We don't check that its valid, or if what it's doing is valid, we just want to flag it as potentially SLP.

Here's how you do it:

# OPRETURN [PUSH 4] S L P 0x00
SLP_PREFIX = bytearray(b"\x6a\x04\x53\x4c\x50\x00")

def has_slp_output(outputs):
    for o in outputs:
        if o.scriptPubKey.startswith(SLP_PREFIX):
            return True
    return False

This uses the python library python-bitcoincash. To install, run pip install bitcoincash (replace pip with pip3 if you're on Debian/Ubuntu to use Python 3)

What magic is this?

SLP token transaction all have an OP_RETURN output. This output also starts with the 4 byte prefix SLP0. So all we need to do is check for this byte prefix.

  • 0x6a - OP_RETURN

  • 0x04 - Push 4 bytes

  • 0x53 - ASCII character 'S'

  • 0x4c - ASCII character 'L'

  • 0x50 - ASCII character 'P'

  • 0x00 - 0

A simple test

Here are two transaction in raw hex, how you parse them and call the above function on them. You can fetch raw transactions from bitcoind with the RPC command getrawtransaction txid.

NOT_SLP = '010000000122836eee490f711e6a32727aeabaf3ea55d577ce66d2dfc3c9f15448e03358990000000064412f09efc8ace5405bec70257f4d749ebab32dbf296158a46195d611c1b4a49f2159789446171fd191ae1c3e3b5151cca79c021d7c0f5d5e3add2fbc9748dc2fe8412103920fbdeb0667bae173b0ab297869206e4bc23faaa527d6c910bb3f6f66a72cfbfeffffff019a8b9600000000001976a91481b193ccc14242267f1b8a07294d7cb12c91356d88ac8d510900'

SLP_TX = "02000000026b1a3267a7f298f1a65786fa17e0887abfbb358f08c67248deda0ef3891bc9d8020000006a47304402203f23889cca2b5fec5dd144696b1927477f98d973ce101ad8bcec269368facbe7022039acb6ce6d6270aef13a8b5c7fb67408831dcb1fbfb09a1eea948d0ca3bb8e5141210350090260acd0cd7a5f7030b2aad76ec6454626ab0872246031f3809d210e4569ffffffff6b1a3267a7f298f1a65786fa17e0887abfbb358f08c67248deda0ef3891bc9d8030000006a4730440220306fda9874be7bd9c079562f96e1526a7c83425992d8e8c0d354a216aa09712402202c29f9e6f7278de141b617d662bb80164fa3b1aa5b3e24fda316388e2f619fde41210350090260acd0cd7a5f7030b2aad76ec6454626ab0872246031f3809d210e4569ffffffff040000000000000000406a04534c500001010453454e44207f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1080000000000000f4a080000000018608da022020000000000001976a9148eec439abdb0fc45bc4dd7a7960b38ac54fd10e688ac22020000000000001976a9144942f11b739a3835d867554ff93cc6685eb1eb5388ac03cf3400000000001976a9144942f11b739a3835d867554ff93cc6685eb1eb5388ac00000000"

from bitcoincash.core import CTransaction, x

tx = CTransaction.deserialize(x(SLP_TX))

tx = CTransaction.deserialize(x(NOT_SLP))
assert(not has_slp_output(tx.vout))

Sponsors of cashdev

$ 0.35
$ 0.10 from @Telesfor
$ 0.10 from @btcfork
$ 0.10 from @unitedstatian
+ 1
Avatar for cashdev
Written by   40
2 years ago
Enjoyed this article?  Earn Bitcoin Cash by sharing it! Explain
...and you will also help the author collect more tips.