def __init__(self, addresses, initial_tx=None, v=0, data=None): Contract.__init__(self, addresses, initial_tx, v) self.participants = 3 self.redeemscript_v1 = joinbytes([ len(addresses[0].hash160), addresses[0].hash160, len(addresses[1].hash160), addresses[1].hash160, len(addresses[2].hash160), addresses[2].hash160, Op.OP_6, Op.OP_PICK, Op.OP_HASH160, Op.OP_6, Op.OP_PICK, Op.OP_HASH160, Op.OP_OVER, Op.OP_5, Op.OP_PICK, Op.OP_EQUAL, Op.OP_2, Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_EQUAL, Op.OP_BOOLOR, Op.OP_VERIFY, Op.OP_DUP, Op.OP_3, Op.OP_PICK, Op.OP_EQUAL, Op.OP_OVER, Op.OP_5, Op.OP_PICK, Op.OP_EQUAL, Op.OP_BOOLOR, Op.OP_VERIFY, Op.OP_2DUP, Op.OP_EQUAL, Op.OP_NOT, Op.OP_VERIFY, Op.OP_6, Op.OP_PICK, Op.OP_9, Op.OP_PICK, Op.OP_CHECKSIGVERIFY, Op.OP_5, Op.OP_PICK, Op.OP_8, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP ]) self.redeemscript = self.redeemscript_v1 self.set_version(v) self.address = Address.from_multisig_script(self.redeemscript) data1 = self.address.to_ui_string() + ' ' + str(self.version) self.op_return = joinbytes( [Op.OP_RETURN, 4, b'>sh\x00', len(data1), data1.encode('utf8')])
def __init__(self, addresses, initial_tx=None, v=0): self.version = v self.initial_tx = initial_tx self.i_time = INHERITACNE_TIME // 512 self.i_time_bytes = (self.i_time).to_bytes(2, 'little') self.rl_time = REFRESH_LOCK_TIME // 512 self.rl_time_bytes = (self.rl_time).to_bytes(2, 'little') self.addresses = addresses assert len(self.rl_time_bytes) == 2 assert len(self.i_time_bytes) == 2 self.redeemscript = joinbytes([ len(addresses[0].hash160), addresses[0].hash160, len(addresses[1].hash160), addresses[1].hash160, len(addresses[2].hash160), addresses[2].hash160, Op.OP_3, Op.OP_PICK, Op.OP_TRUE, Op.OP_EQUAL, Op.OP_IF, Op.OP_10, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, Op.OP_4, Op.OP_EQUALVERIFY, Op.OP_9, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, 1, 100, Op.OP_EQUALVERIFY, Op.OP_7, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, Op.OP_8, Op.OP_EQUALVERIFY, Op.OP_6, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, Op.OP_4, Op.OP_EQUALVERIFY, Op.OP_5, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, 1, 32, Op.OP_EQUALVERIFY, Op.OP_4, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, Op.OP_8, Op.OP_EQUALVERIFY, Op.OP_12, Op.OP_PICK, Op.OP_HASH160, Op.OP_3, Op.OP_PICK, Op.OP_EQUALVERIFY, Op.OP_11, Op.OP_PICK, Op.OP_13, Op.OP_PICK, Op.OP_CHECKSIGVERIFY, Op.OP_10, Op.OP_PICK, Op.OP_10, Op.OP_PICK, Op.OP_CAT, Op.OP_9, Op.OP_PICK, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, Op.OP_6, Op.OP_PICK, Op.OP_CAT, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_12, Op.OP_PICK, Op.OP_SIZE, Op.OP_1SUB, Op.OP_SPLIT, Op.OP_DROP, Op.OP_OVER, Op.OP_SHA256, Op.OP_15, Op.OP_PICK, Op.OP_CHECKDATASIGVERIFY, 2, 232, 3, Op.OP_9, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_OVER, Op.OP_SUB, Op.OP_8, Op.OP_NUM2BIN, Op.OP_13, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_2, Op.OP_GREATERTHANOREQUAL, Op.OP_VERIFY, 1, 135, 1, 169, 1, 20, 1, 23, Op.OP_15, Op.OP_PICK, Op.OP_3, Op.OP_SPLIT, Op.OP_NIP, 3, self.rl_time_bytes, 64, Op.OP_CHECKSEQUENCEVERIFY, Op.OP_DROP, Op.OP_5, Op.OP_PICK, Op.OP_2, Op.OP_PICK, Op.OP_CAT, Op.OP_4, Op.OP_PICK, Op.OP_CAT, Op.OP_3, Op.OP_PICK, Op.OP_CAT, Op.OP_OVER, Op.OP_HASH160, Op.OP_CAT, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_HASH256, Op.OP_14, Op.OP_PICK, Op.OP_EQUAL, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_3, Op.OP_PICK, Op.OP_2, Op.OP_EQUAL, Op.OP_IF, Op.OP_5, Op.OP_PICK, Op.OP_HASH160, Op.OP_2, Op.OP_PICK, Op.OP_EQUALVERIFY, Op.OP_4, Op.OP_PICK, Op.OP_6, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_3, Op.OP_PICK, Op.OP_3, Op.OP_EQUAL, Op.OP_IF, 3, self.i_time_bytes, 64, Op.OP_CHECKSEQUENCEVERIFY, Op.OP_DROP, Op.OP_5, Op.OP_PICK, Op.OP_HASH160, Op.OP_OVER, Op.OP_EQUALVERIFY, Op.OP_4, Op.OP_PICK, Op.OP_6, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_FALSE, Op.OP_ENDIF, Op.OP_ENDIF, Op.OP_ENDIF ]) #assert 76 < len(self.redeemscript) <= 255 # simplify push in scriptsig; note len is around 200. self.address = Address.from_multisig_script(self.redeemscript)
def __init__(self, addresses): self.time1 = (180 * 3600 * 24) // 512 self.time_bytes = (self.time1).to_bytes(2, 'little') self.time2 = (7 * 3600 * 24) // 512 self.time2_bytes = (self.time2).to_bytes(2, 'little') self.addresses = addresses assert len(self.time2_bytes) == 2 assert len(self.time_bytes) == 2 self.redeemscript = joinbytes([ len(addresses[0].hash160), addresses[0].hash160, len(addresses[1].hash160), addresses[1].hash160, len(addresses[2].hash160), addresses[2].hash160, Op.OP_3, Op.OP_PICK, Op.OP_TRUE, Op.OP_EQUAL, Op.OP_IF, Op.OP_12, Op.OP_PICK, Op.OP_HASH160, Op.OP_3, Op.OP_PICK, Op.OP_EQUALVERIFY, Op.OP_11, Op.OP_PICK, Op.OP_13, Op.OP_PICK, Op.OP_CHECKSIGVERIFY, Op.OP_10, Op.OP_PICK, Op.OP_10, Op.OP_PICK, Op.OP_CAT, Op.OP_9, Op.OP_PICK, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, Op.OP_6, Op.OP_PICK, Op.OP_CAT, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_12, Op.OP_PICK, Op.OP_SIZE, Op.OP_1SUB, Op.OP_SPLIT, Op.OP_DROP, Op.OP_OVER, Op.OP_SHA256, Op.OP_15, Op.OP_PICK, Op.OP_CHECKDATASIGVERIFY, 2, 232, 3, Op.OP_9, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_OVER, Op.OP_SUB, Op.OP_8, Op.OP_NUM2BIN, 1, 135, 1, 169, 1, 20, 1, 23, Op.OP_15, Op.OP_PICK, Op.OP_TRUE, Op.OP_SPLIT, Op.OP_NIP, 3, self.time2_bytes, 64, Op.OP_CHECKSEQUENCEVERIFY, Op.OP_DROP, 1, 18, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_2, Op.OP_GREATERTHANOREQUAL, Op.OP_VERIFY, Op.OP_5, Op.OP_PICK, Op.OP_2, Op.OP_PICK, Op.OP_CAT, Op.OP_4, Op.OP_PICK, Op.OP_CAT, Op.OP_3, Op.OP_PICK, Op.OP_CAT, Op.OP_OVER, Op.OP_HASH160, Op.OP_CAT, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_HASH256, Op.OP_14, Op.OP_PICK, Op.OP_EQUAL, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_3, Op.OP_PICK, Op.OP_2, Op.OP_EQUAL, Op.OP_IF, Op.OP_5, Op.OP_PICK, Op.OP_HASH160, Op.OP_2, Op.OP_PICK, Op.OP_EQUALVERIFY, Op.OP_4, Op.OP_PICK, Op.OP_6, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_3, Op.OP_PICK, Op.OP_3, Op.OP_EQUAL, Op.OP_IF, 3, self.time_bytes, 64, Op.OP_CHECKSEQUENCEVERIFY, Op.OP_DROP, Op.OP_5, Op.OP_PICK, Op.OP_HASH160, Op.OP_OVER, Op.OP_EQUALVERIFY, Op.OP_4, Op.OP_PICK, Op.OP_6, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_FALSE, Op.OP_ENDIF, Op.OP_ENDIF, Op.OP_ENDIF ]) assert 76 < len( self.redeemscript ) <= 255 # simplify push in scriptsig; note len is around 200. self.address = Address.from_multisig_script(self.redeemscript)
def pubkeys_to_multisig_p2sh(pubkeys: Sequence[str], m: int) -> str: """ :param pubkeys: List of publics keys, as hexadecimal strings. The keys will be sorted. :param m: Minimal number of signatures to unlock the multisig script (it is the M in M-of-N) :return: p2sh CashAddr """ pubkeys_bytes = [bytes.fromhex(pubkey) for pubkey in pubkeys] redeem_script = Script.multisig_script(m, sorted(pubkeys_bytes)) fmt = Address.FMT_CASHADDR_BCH return Address.from_multisig_script(redeem_script).to_full_string(fmt)
def __init__(self, master_privkey): G = generator_secp256k1 order = G.order() # make two derived private keys (integers between 1 and p-1 inclusive) # hard derivation (irreversible): x = int.from_bytes(hashlib.sha512(b'Split1' + master_privkey.to_bytes(32, 'big')).digest(), 'big') self.priv1 = 1 + (x % (order-1)) x = int.from_bytes(hashlib.sha512(b'Split2' + master_privkey.to_bytes(32, 'big')).digest(), 'big') self.priv2 = 1 + (x % (order-1)) # soft derivation (reversible): #self.priv1 = (0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa * master_privkey) % order #self.priv2 = (0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb * master_privkey) % order # generate compressed pubkeys self.pub1ser = point_to_ser(self.priv1 * G, True) self.pub2ser = point_to_ser(self.priv2 * G, True) self.keypairs = { self.pub1ser.hex() : (self.priv1.to_bytes(32, 'big'), True), self.pub2ser.hex() : (self.priv2.to_bytes(32, 'big'), True), } # params from ABC 0.18.2 unit tests cds_sig = bytes.fromhex('30440220256c12175e809381f97637933ed6ab97737d263eaaebca6add21bced67fd12a402205ce29ecc1369d6fc1b51977ed38faaf41119e3be1d7edfafd7cfaf0b6061bd07') cds_msg = b'' cds_pubkey = bytes.fromhex('038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508') self.redeemscript = joinbytes([ OpCodes.OP_IF, #this branch can only run on CDS-supporting chain len(cds_sig), cds_sig, len(cds_msg), cds_msg, len(cds_pubkey), cds_pubkey, OpCodes.OP_CHECKDATASIGVERIFY, len(self.pub1ser), self.pub1ser, OpCodes.OP_ELSE, #this branch can run on any chain len(self.pub2ser), self.pub2ser, OpCodes.OP_ENDIF, OpCodes.OP_CHECKSIG ]) assert 76 < len(self.redeemscript) <= 255 # simplify push in scriptsig; note len is around 200. self.address = Address.from_multisig_script(self.redeemscript) # make dummy scripts of correct size for size estimation. self.dummy_scriptsig_redeem = '01'*(4 + 72 + len(self.redeemscript)) self.dummy_scriptsig_refund = '00'*(4 + 72 + len(self.redeemscript))
def __init__(self, master_privkey): G = generator_secp256k1 order = G.order() # make two derived private keys (integers between 1 and p-1 inclusive) # hard derivation (irreversible): x = int.from_bytes( hashlib.sha512(b'SplitMUL' + master_privkey.to_bytes(32, 'big')).digest(), 'big') self.priv1 = 1 + (x % (order - 1)) # generate compressed pubkeys self.pub1ser = point_to_ser(self.priv1 * G, True) self.keypairs = { self.pub1ser.hex(): (self.priv1.to_bytes(32, 'big'), True), } self.redeemscript = joinbytes([ #this script can only run on MUL-supporting chain len(self.pub1ser), self.pub1ser, OpCodes.OP_CHECKSIGVERIFY, OpCodes.OP_1, OpCodes.OP_1, OpCodes.OP_MUL, ]) assert len( self.redeemscript ) <= 76 # simplify push in scriptsig; note len is around 38. self.address = Address.from_multisig_script(self.redeemscript) # make dummy scripts of correct size for size estimation. self.dummy_scriptsig_redeem = '01' * (3 + 72 + len(self.redeemscript))
def __init__(self, addresses, initial_tx=None,v=0, data=None): Contract.__init__(self, addresses,initial_tx,v) self.participants=2 try: self.i_time = data[0] self.rpayment = data[1] except: self.rpayment = PLEDGE self.i_time = PLEDGE_TIME // 512 self.i_time_bytes = self.i_time.to_bytes(2, 'little', signed=True) try: self.i_time_bytes_mec = (self.i_time+MONTH).to_bytes(2, 'little', signed=True) # time + 1 month for mecenas except: if self.version !=2: self.i_time_bytes_mec = self.i_time_bytes pass assert self.rpayment >= 0 assert self.i_time >= 0 try: self.rpayment_bytes = self.rpayment.to_bytes(ceil(self.rpayment.bit_length() / 8), 'little', signed=True) except OverflowError: self.rpayment_bytes = self.rpayment.to_bytes(ceil(self.rpayment.bit_length() / 8)+1, 'little', signed=True) assert len(self.i_time_bytes) == 2 assert len(self.rpayment_bytes) < 76 # Better safe than sorry ## Legacy version of Mecenas script self.redeemscript_v1 = joinbytes([ len(addresses[0].hash160), addresses[0].hash160, len(addresses[1].hash160), addresses[1].hash160, len(self.rpayment_bytes), self.rpayment_bytes, Op.OP_3, Op.OP_PICK, Op.OP_TRUE, Op.OP_EQUAL, Op.OP_IF, Op.OP_10, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, Op.OP_4, Op.OP_EQUALVERIFY, Op.OP_9, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, 1, 100, Op.OP_EQUALVERIFY, Op.OP_7, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, Op.OP_8, Op.OP_EQUALVERIFY, Op.OP_6, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, Op.OP_4, Op.OP_EQUALVERIFY, Op.OP_5, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, 1, 32, Op.OP_EQUALVERIFY, Op.OP_4, Op.OP_PICK, Op.OP_SIZE, Op.OP_NIP, Op.OP_8, Op.OP_EQUALVERIFY, Op.OP_11, Op.OP_PICK, Op.OP_13, Op.OP_PICK, Op.OP_CHECKSIGVERIFY, Op.OP_10, Op.OP_PICK, Op.OP_10, Op.OP_PICK, Op.OP_CAT, Op.OP_9, Op.OP_PICK, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, Op.OP_6, Op.OP_PICK, Op.OP_CAT, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_12, Op.OP_PICK, Op.OP_SIZE, Op.OP_1SUB, Op.OP_SPLIT, Op.OP_DROP, Op.OP_OVER, Op.OP_SHA256, Op.OP_15, Op.OP_PICK, Op.OP_CHECKDATASIGVERIFY, 2, 232, 3, Op.OP_2, Op.OP_PICK, Op.OP_8, Op.OP_NUM2BIN, Op.OP_10, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_4, Op.OP_PICK, Op.OP_SUB, Op.OP_2, Op.OP_PICK, Op.OP_SUB, Op.OP_8, Op.OP_NUM2BIN, 1, 118, 1, 135, 1, 169, 1, 20, 1, 23, 1, 25, 1, 136, 1, 172, 1, 20, Op.OP_PICK, Op.OP_3, Op.OP_SPLIT, Op.OP_NIP, 3, self.i_time_bytes, 64, Op.OP_CHECKSEQUENCEVERIFY, Op.OP_DROP, 1, 23, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_2, Op.OP_GREATERTHANOREQUAL, Op.OP_VERIFY, Op.OP_9, Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, Op.OP_6, Op.OP_PICK, Op.OP_CAT, Op.OP_OVER, Op.OP_HASH160, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_11, Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_10, Op.OP_PICK, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, 1, 17, Op.OP_PICK, Op.OP_CAT, Op.OP_4, Op.OP_PICK, Op.OP_CAT, Op.OP_3, Op.OP_PICK, Op.OP_CAT, Op.OP_2DUP, Op.OP_CAT, Op.OP_HASH256, 1, 21, Op.OP_PICK, Op.OP_EQUAL, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_3, Op.OP_PICK, Op.OP_2, Op.OP_EQUAL, Op.OP_IF, Op.OP_5, Op.OP_PICK, Op.OP_HASH160, Op.OP_2, Op.OP_PICK, Op.OP_EQUALVERIFY, Op.OP_4, Op.OP_PICK, Op.OP_6, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_FALSE, Op.OP_ENDIF, Op.OP_ENDIF ]) # Current version of Mecenas script self.redeemscript_v1_1 = joinbytes([ len(addresses[0].hash160), addresses[0].hash160, len(addresses[1].hash160), addresses[1].hash160, len(self.rpayment_bytes), self.rpayment_bytes, 3, self.i_time_bytes, 64, Op.OP_4, Op.OP_PICK, Op.OP_TRUE, Op.OP_EQUAL, Op.OP_IF, Op.OP_5, Op.OP_PICK, Op.OP_4, Op.OP_SPLIT, Op.OP_DROP, Op.OP_6, Op.OP_PICK, Op.OP_DUP, Op.OP_SIZE, Op.OP_NIP, 1, 40, Op.OP_SUB, Op.OP_SPLIT, Op.OP_NIP, Op.OP_DUP, 1, 32, Op.OP_SPLIT, Op.OP_DROP, Op.OP_8, Op.OP_PICK, Op.OP_DUP, Op.OP_SIZE, Op.OP_NIP, 1, 44, Op.OP_SUB, Op.OP_SPLIT, Op.OP_DROP, Op.OP_DUP, 1, 104, Op.OP_SPLIT, Op.OP_NIP, Op.OP_DUP, Op.OP_OVER, Op.OP_SIZE, Op.OP_NIP, Op.OP_8, Op.OP_SUB, Op.OP_SPLIT, Op.OP_13, Op.OP_PICK, Op.OP_15, Op.OP_PICK, Op.OP_CHECKSIGVERIFY, Op.OP_13, Op.OP_PICK, Op.OP_SIZE, Op.OP_1SUB, Op.OP_SPLIT, Op.OP_DROP, Op.OP_13, Op.OP_PICK, Op.OP_SHA256, Op.OP_16, Op.OP_PICK, Op.OP_CHECKDATASIGVERIFY, 2, 232, 3, Op.OP_8, Op.OP_PICK, Op.OP_CHECKSEQUENCEVERIFY, Op.OP_DROP, Op.OP_7, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_2, Op.OP_GREATERTHANOREQUAL, Op.OP_VERIFY, Op.OP_OVER, Op.OP_BIN2NUM, Op.OP_10, Op.OP_PICK, Op.OP_2, Op.OP_PICK, Op.OP_ADD, Op.OP_LESSTHANOREQUAL, Op.OP_IF, Op.OP_15, Op.OP_PICK, Op.OP_HASH160, Op.OP_12, Op.OP_PICK, Op.OP_EQUALVERIFY, Op.OP_14, Op.OP_PICK, Op.OP_16, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_ELSE, Op.OP_9, Op.OP_PICK, Op.OP_8, Op.OP_NUM2BIN, Op.OP_2, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_11, Op.OP_PICK, Op.OP_SUB, Op.OP_2, Op.OP_PICK, Op.OP_SUB, Op.OP_8, Op.OP_NUM2BIN, 1, 118, 1, 135, 1, 169, 1, 20, 1, 23, 1, 25, 1, 136, 1, 172, Op.OP_12, Op.OP_PICK, Op.OP_3, Op.OP_SPLIT, Op.OP_NIP, Op.OP_9, Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, Op.OP_6, Op.OP_PICK, Op.OP_CAT, Op.OP_OVER, Op.OP_HASH160, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_11, Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_10, Op.OP_PICK, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, 1, 24, Op.OP_PICK, Op.OP_CAT, Op.OP_4, Op.OP_PICK, Op.OP_CAT, Op.OP_3, Op.OP_PICK, Op.OP_CAT, Op.OP_2DUP, Op.OP_CAT, Op.OP_HASH256, 1, 19, Op.OP_PICK, Op.OP_EQUAL, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ENDIF, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_4, Op.OP_PICK, Op.OP_2, Op.OP_EQUAL, Op.OP_IF, Op.OP_6, Op.OP_PICK, Op.OP_HASH160, Op.OP_3, Op.OP_PICK, Op.OP_EQUALVERIFY, Op.OP_5, Op.OP_PICK, Op.OP_7, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_FALSE, Op.OP_ENDIF, Op.OP_ENDIF ]) ## version with locktime for mecenas self.redeemscript_v2 = joinbytes([ len(addresses[0].hash160), addresses[0].hash160, len(addresses[1].hash160), addresses[1].hash160, len(self.rpayment_bytes), self.rpayment_bytes, 3, self.i_time_bytes, 64, 3, self.i_time_bytes_mec, 64, Op.OP_5, Op.OP_PICK, Op.OP_TRUE, Op.OP_EQUAL, Op.OP_IF, Op.OP_6, Op.OP_PICK, Op.OP_4, Op.OP_SPLIT, Op.OP_DROP, Op.OP_7, Op.OP_PICK, Op.OP_DUP, Op.OP_SIZE, Op.OP_NIP, 1, 40, Op.OP_SUB, Op.OP_SPLIT, Op.OP_NIP, Op.OP_DUP, 1, 32, Op.OP_SPLIT, Op.OP_DROP, Op.OP_9, Op.OP_PICK, Op.OP_DUP, Op.OP_SIZE, Op.OP_NIP, 1, 44, Op.OP_SUB, Op.OP_SPLIT, Op.OP_DROP, Op.OP_DUP, 1, 104, Op.OP_SPLIT, Op.OP_NIP, Op.OP_DUP, Op.OP_OVER, Op.OP_SIZE, Op.OP_NIP, Op.OP_8, Op.OP_SUB, Op.OP_SPLIT, Op.OP_14, Op.OP_PICK, Op.OP_16, Op.OP_PICK, Op.OP_CHECKSIGVERIFY, Op.OP_14, Op.OP_PICK, Op.OP_SIZE, Op.OP_1SUB, Op.OP_SPLIT, Op.OP_DROP, Op.OP_14, Op.OP_PICK, Op.OP_SHA256, 1, 17, Op.OP_PICK, Op.OP_CHECKDATASIGVERIFY, 2, 232, 3, Op.OP_9, Op.OP_PICK, Op.OP_CHECKSEQUENCEVERIFY, Op.OP_DROP, Op.OP_7, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_2, Op.OP_GREATERTHANOREQUAL, Op.OP_VERIFY, Op.OP_OVER, Op.OP_BIN2NUM, Op.OP_11, Op.OP_PICK, Op.OP_2, Op.OP_PICK, Op.OP_ADD, Op.OP_LESSTHANOREQUAL, Op.OP_IF, Op.OP_16, Op.OP_PICK, Op.OP_HASH160, Op.OP_13, Op.OP_PICK, Op.OP_EQUALVERIFY, Op.OP_15, Op.OP_PICK, 1, 17, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_ELSE, Op.OP_10, Op.OP_PICK, Op.OP_8, Op.OP_NUM2BIN, Op.OP_2, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_12, Op.OP_PICK, Op.OP_SUB, Op.OP_2, Op.OP_PICK, Op.OP_SUB, Op.OP_8, Op.OP_NUM2BIN, 1, 118, 1, 135, 1, 169, 1, 20, 1, 23, 1, 25, 1, 136, 1, 172, Op.OP_12, Op.OP_PICK, Op.OP_3, Op.OP_SPLIT, Op.OP_NIP, Op.OP_9, Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, Op.OP_6, Op.OP_PICK, Op.OP_CAT, Op.OP_OVER, Op.OP_HASH160, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_11, Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_10, Op.OP_PICK, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, 1, 25, Op.OP_PICK, Op.OP_CAT, Op.OP_4, Op.OP_PICK, Op.OP_CAT, Op.OP_3, Op.OP_PICK, Op.OP_CAT, Op.OP_2DUP, Op.OP_CAT, Op.OP_HASH256, 1, 19, Op.OP_PICK, Op.OP_EQUAL, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ENDIF, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_5, Op.OP_PICK, Op.OP_2, Op.OP_EQUAL, Op.OP_IF, Op.OP_DUP, Op.OP_CHECKSEQUENCEVERIFY, Op.OP_DROP, Op.OP_7, Op.OP_PICK, Op.OP_HASH160, Op.OP_4, Op.OP_PICK, Op.OP_EQUALVERIFY, Op.OP_6, Op.OP_PICK, Op.OP_8, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_FALSE, Op.OP_ENDIF, Op.OP_ENDIF ]) ## Escrow version of Mecenas if len(addresses)==3: self.redeemscript_v3 = joinbytes([ len(addresses[0].hash160), addresses[0].hash160, len(addresses[1].hash160), addresses[1].hash160, len(addresses[2].hash160), addresses[2].hash160, len(self.rpayment_bytes), self.rpayment_bytes, 3, self.i_time_bytes, 64, Op.OP_5, Op.OP_PICK, Op.OP_TRUE, Op.OP_EQUAL, Op.OP_IF, Op.OP_6, Op.OP_PICK, Op.OP_4, Op.OP_SPLIT, Op.OP_DROP, Op.OP_7, Op.OP_PICK, Op.OP_DUP, Op.OP_SIZE, Op.OP_NIP, 1, 40, Op.OP_SUB, Op.OP_SPLIT, Op.OP_NIP, Op.OP_DUP, 1, 32, Op.OP_SPLIT, Op.OP_DROP, Op.OP_9, Op.OP_PICK, Op.OP_DUP, Op.OP_SIZE, Op.OP_NIP, 1, 44, Op.OP_SUB, Op.OP_SPLIT, Op.OP_DROP, Op.OP_DUP, 1, 104, Op.OP_SPLIT, Op.OP_NIP, Op.OP_DUP, Op.OP_OVER, Op.OP_SIZE, Op.OP_NIP, Op.OP_8, Op.OP_SUB, Op.OP_SPLIT, Op.OP_14, Op.OP_PICK, Op.OP_16, Op.OP_PICK, Op.OP_CHECKSIGVERIFY, Op.OP_14, Op.OP_PICK, Op.OP_SIZE, Op.OP_1SUB, Op.OP_SPLIT, Op.OP_DROP, Op.OP_14, Op.OP_PICK, Op.OP_SHA256, 1, 17, Op.OP_PICK, Op.OP_CHECKDATASIGVERIFY, 2, 220, 5, Op.OP_8, Op.OP_PICK, Op.OP_CHECKSEQUENCEVERIFY, Op.OP_DROP, Op.OP_7, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_2, Op.OP_GREATERTHANOREQUAL, Op.OP_VERIFY, Op.OP_OVER, Op.OP_BIN2NUM, Op.OP_10, Op.OP_PICK, Op.OP_2, Op.OP_PICK, Op.OP_ADD, Op.OP_LESSTHANOREQUAL, Op.OP_IF, Op.OP_16, Op.OP_PICK, Op.OP_HASH160, Op.OP_13, Op.OP_PICK, Op.OP_EQUALVERIFY, Op.OP_15, Op.OP_PICK, 1, 17, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_ELSE, Op.OP_9, Op.OP_PICK, Op.OP_8, Op.OP_NUM2BIN, Op.OP_2, Op.OP_PICK, Op.OP_BIN2NUM, Op.OP_11, Op.OP_PICK, Op.OP_SUB, Op.OP_2, Op.OP_PICK, Op.OP_SUB, Op.OP_8, Op.OP_NUM2BIN, 1, 118, 1, 135, 1, 169, 1, 20, 1, 23, 1, 25, 1, 136, 1, 172, Op.OP_12, Op.OP_PICK, Op.OP_3, Op.OP_SPLIT, Op.OP_NIP, Op.OP_9, Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, Op.OP_6, Op.OP_PICK, Op.OP_CAT, Op.OP_OVER, Op.OP_HASH160, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_11, Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_CAT, Op.OP_10, Op.OP_PICK, Op.OP_CAT, Op.OP_8, Op.OP_PICK, Op.OP_CAT, Op.OP_7, Op.OP_PICK, Op.OP_CAT, 1, 25, Op.OP_PICK, Op.OP_CAT, Op.OP_4, Op.OP_PICK, Op.OP_CAT, Op.OP_3, Op.OP_PICK, Op.OP_CAT, Op.OP_2DUP, Op.OP_CAT, Op.OP_HASH256, 1, 19, Op.OP_PICK, Op.OP_EQUAL, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ENDIF, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_5, Op.OP_PICK, Op.OP_2, Op.OP_EQUAL, Op.OP_IF, Op.OP_9, Op.OP_PICK, Op.OP_HASH160, Op.OP_5, Op.OP_PICK, Op.OP_EQUAL, Op.OP_10, Op.OP_PICK, Op.OP_HASH160, Op.OP_5, Op.OP_PICK, Op.OP_EQUAL, Op.OP_BOOLOR, Op.OP_VERIFY, Op.OP_8, Op.OP_PICK, Op.OP_HASH160, Op.OP_3, Op.OP_PICK, Op.OP_EQUAL, Op.OP_9, Op.OP_PICK, Op.OP_HASH160, Op.OP_5, Op.OP_PICK, Op.OP_EQUAL, Op.OP_BOOLOR, Op.OP_VERIFY, Op.OP_9, Op.OP_PICK, Op.OP_9, Op.OP_PICK, Op.OP_EQUAL, Op.OP_NOT, Op.OP_VERIFY, Op.OP_7, Op.OP_PICK, Op.OP_10, Op.OP_PICK, Op.OP_CHECKSIGVERIFY, Op.OP_6, Op.OP_PICK, Op.OP_9, Op.OP_PICK, Op.OP_CHECKSIG, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_NIP, Op.OP_ELSE, Op.OP_FALSE, Op.OP_ENDIF, Op.OP_ENDIF ]) self.redeemscript=self.redeemscript_v1 self.set_version(v) self.address = Address.from_multisig_script(self.redeemscript) data1 = self.address.to_ui_string() + ' ' + str(self.version) data2 = str(self.i_time) + ' ' + str(self.rpayment) self.op_return = joinbytes( [Op.OP_RETURN, 4, b'>sh\x00', len(data1), data1.encode('utf8'), len(data2), data2.encode('utf8')])