示例#1
0
    def execute(self, arguments):
        wallet = PromptData.Wallet

        if len(arguments) < 3:
            print("Please specify the minimum required parameters")
            return False

        pubkey_in_wallet = arguments[0]
        if not PromptUtils.is_valid_public_key(pubkey_in_wallet):
            print("Invalid public key format")
            return False

        key_script_hash = Crypto.ToScriptHash(pubkey_in_wallet, unhex=True)
        if not wallet.ContainsKeyHash(key_script_hash):
            print("Supplied first public key does not exist in own wallet.")
            return False

        try:
            min_signature_cnt = int(arguments[1])
        except ValueError:
            print(f"Invalid minimum signature count value: {arguments[1]}")
            return False

        if min_signature_cnt < 1:
            print("Minimum signatures count cannot be lower than 1")
            return False

        # validate minimum required signing key count
        signing_keys = arguments[2:]
        len_signing_keys = len(signing_keys)
        if len_signing_keys < min_signature_cnt:
            # we need at least 2 public keys in total otherwise it's just a regular address.
            # 1 pub key is from an address in our own wallet, a secondary key can come from any place.
            print(
                f"Missing remaining signing keys. Minimum required: {min_signature_cnt} given: {len_signing_keys}"
            )
            return False

        # validate remaining pub keys
        for key in signing_keys:
            if not PromptUtils.is_valid_public_key(key):
                print(f"Invalid signing key {key}")
                return False

        signing_keys.append(pubkey_in_wallet)

        # validate that all signing keys are unique
        if len(signing_keys) > len(set(signing_keys)):
            print("Provided signing keys are not unique")
            return False

        verification_contract = Contract.CreateMultiSigContract(
            key_script_hash, min_signature_cnt, signing_keys)
        address = verification_contract.Address
        wallet.AddContract(verification_contract)
        print(f"Added multi-sig contract address {address} to wallet")
        return True
示例#2
0
    def execute(self, arguments):
        wallet = PromptData.Wallet

        if len(arguments) != 2:
            print("Please specify the required parameters")
            return

        try:
            contract_hash = UInt160.ParseString(arguments[0]).ToBytes()
        except Exception:
            print(f"Invalid contract hash: {arguments[0]}")
            return

        pubkey = arguments[1]
        if not PromptUtils.is_valid_public_key(pubkey):
            print(f"Invalid pubkey: {arguments[1]}")
            return

        pubkey_script_hash = Crypto.ToScriptHash(pubkey, unhex=True)

        return ImportContractAddr(wallet, contract_hash, pubkey_script_hash)