コード例 #1
0
    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')])
コード例 #2
0
    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)
コード例 #3
0
    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)
コード例 #4
0
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)
コード例 #5
0
    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))
コード例 #6
0
    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))
コード例 #7
0
    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')])