def get_zkey_from_sk(self, sk: str, d: str = None) -> dict: """Get the shielded address from sk(spending key) and d(diversifier).""" if len(sk) != 64: raise BadKey("32 byte sk required") if d and len(d) != 22: raise BadKey("11 byte d required") esk = self.provider.make_request("wallet/getexpandedspendingkey", {"value": sk}) ask = esk["ask"] nsk = esk["nsk"] ovk = esk["ovk"] ak = self.provider.make_request("wallet/getakfromask", {"value": ask})["value"] nk = self.provider.make_request("wallet/getnkfromnsk", {"value": nsk})["value"] ivk = self.provider.make_request("wallet/getincomingviewingkey", {"ak": ak, "nk": nk})["ivk"] if d is None: d = self.provider.make_request("wallet/getdiversifier")["d"] ret = self.provider.make_request("wallet/getzenpaymentaddress", {"ivk": ivk, "d": d}) pkD = ret["pkD"] payment_address = ret["payment_address"] return dict( sk=sk, ask=ask, nsk=nsk, ovk=ovk, ak=ak, nk=nk, ivk=ivk, d=d, pkD=pkD, payment_address=payment_address, )
def sign(self, priv_key: PrivateKey) -> "Transaction": """Sign the transaction with a private key.""" assert self.txid, "txID not calculated" if self._permission is not None: addr_of_key = priv_key.public_key.to_hex_address() for key in self._permission["keys"]: if key["address"] == addr_of_key: break else: raise BadKey( "provided private key is not in the permission list", "provided {}".format(priv_key.public_key.to_base58check_address()), "required {}".format(self._permission), ) sig = priv_key.sign_msg_hash(bytes.fromhex(self.txid)) self._signature.append(sig.hex()) return self