import "ordinal.scrypt"; contract BSV20V2P2PKH { @state bytes id; const int max; const int dec; const bytes sym; const Ripemd160 addr; bytes __scrypt_ts_ctx_outpoint_txid; int __scrypt_ts_ctx_outpoint_outputindex; constructor(bytes id, bytes sym, int amt, int dec, Ripemd160 addr) { this.max = amt; this.dec = dec; this.id = id; this.sym = sym; require(this.max <= 18446744073709551615); require(this.dec <= 18); this.addr = addr; } function buildStateOutputFT(int amt) : bytes { if(this.isGenesis()) { this.initId(); } bytes stateScript = BSV20V2P2PKH.createTransferInsciption(this.id, amt) + Ordinal.removeInsciption(this.getStateScript()); return Utils.buildOutput(stateScript, 1); } function isGenesis() : bool { return this.id == b''; } static function buildTransferOutput(Ripemd160 address, bytes id, int amt) : bytes { bytes transferScript = BSV20V2P2PKH.buildTransferScript(address, id, amt); return Utils.buildOutput(transferScript, 1); } static function buildTransferScript(Ripemd160 address, bytes id, int amt) : bytes { return (BSV20V2P2PKH.createTransferInsciption(id, amt) + Utils.buildPublicKeyHashScript(address)); } static function createTransferInsciption(bytes id, int amt) : bytes { bytes amtByteString = Ordinal.int2Str(amt); bytes transferJSON = "{\"p\":\"bsv-20\",\"op\":\"transfer\",\"id\":\"" + id + "\",\"amt\":\"" + amtByteString + "\"}"; return Ordinal.createInsciption(transferJSON, "application/bsv-20"); } function initId() : bool { this.id = Ordinal.txId2str(this.__scrypt_ts_ctx_outpoint_txid) + "_" + Ordinal.int2Str(this.__scrypt_ts_ctx_outpoint_outputindex); return true; } public function unlock(Sig sig, PubKey pubkey) { require(hash160(pubkey) == this.addr); require(checkSig(sig, pubkey)); } }