/// <summary> /// Sign LogicSig with account's secret key /// </summary> /// <param name="lsig">LogicsigSignature to sign</param> /// <returns>LogicsigSignature with updated signature</returns> public LogicsigSignature SignLogicsig(LogicsigSignature lsig) { byte[] bytesToSign = lsig.BytesToSign(); Signature sig = this.RawSignBytes(bytesToSign); lsig.sig = sig; return(lsig); }
/// <summary> /// Sign LogicSig as multisig /// </summary> /// <param name="lsig">LogicsigSignature to sign</param> /// <param name="ma">MultisigAddress to format multi signature from</param> /// <returns>LogicsigSignature</returns> public LogicsigSignature SignLogicsig(LogicsigSignature lsig, MultisigAddress ma) { var pk = this.GetEd25519PublicKey(); int pkIndex = -1; for (int i = 0; i < ma.publicKeys.Count; i++) { if (Enumerable.SequenceEqual(pk.GetEncoded(), ma.publicKeys[i].GetEncoded())) { pkIndex = i; break; } } if (pkIndex == -1) { throw new ArgumentException("Multisig account does not contain this secret key"); } // now, create the multisignature byte[] bytesToSign = lsig.BytesToSign(); Signature sig = this.RawSignBytes(bytesToSign); MultisigSignature mSig = new MultisigSignature(ma.version, ma.threshold); for (int i = 0; i < ma.publicKeys.Count; i++) { if (i == pkIndex) { mSig.subsigs.Add(new MultisigSubsig(pk, sig)); } else { mSig.subsigs.Add(new MultisigSubsig(ma.publicKeys[i])); } } lsig.msig = mSig; return(lsig); }
/// <summary> /// Appends a signature to multisig logic signed transaction /// </summary> /// <param name="lsig">LogicsigSignature append to</param> /// <returns>LogicsigSignature</returns> public LogicsigSignature AppendToLogicsig(LogicsigSignature lsig) { var pk = this.GetEd25519PublicKey(); int pkIndex = -1; for (int i = 0; i < lsig.msig.subsigs.Count; i++) { MultisigSubsig subsig = lsig.msig.subsigs[i]; if (Enumerable.SequenceEqual(subsig.key.GetEncoded(), pk.GetEncoded())) { pkIndex = i; } } if (pkIndex == -1) { throw new ArgumentException("Multisig account does not contain this secret key"); } // now, create the multisignature byte[] bytesToSign = lsig.BytesToSign(); Signature sig = this.RawSignBytes(bytesToSign); lsig.msig.subsigs[pkIndex] = new MultisigSubsig(pk, sig); return(lsig); }