fromPubkeys method

Future<ProgramBuilder> fromPubkeys (List<PublicKey> pubkeys, int m)

TODO:: add tests later see: https://github.com/ontio/ontology-ts-sdk/blob/4a77b47090df55b81ed13d0eeb6e93c65a3851ff/test/transfer.test.ts

Implementation

static Future<ProgramBuilder> fromPubkeys(
    List<PublicKey> pubkeys, int m) async {
  ProgramBuilder prog = ProgramBuilder();
  int n = pubkeys.length;
  if (!(1 <= m && m <= n && n <= 1024))
    throw ArgumentError('Wrong multi sig params');

  Map<String, _Pubkey> pkMap = {};
  List<Future<dynamic>> convertTasks = [];
  var convertToPk = (PublicKey key) async {
    var pk = await _Pubkey.from(key);
    var kk = Convert.bytesToHexStr(key.raw);
    pkMap[kk] = pk;
  };

  pubkeys.forEach((pk) => convertTasks.add(convertToPk(pk)));
  await Future.wait(convertTasks);

  pubkeys.sort((a, b) {
    var ka = Convert.bytesToHexStr(a.raw);
    var kb = Convert.bytesToHexStr(b.raw);
    return comparePublicKeys(pkMap[ka], pkMap[kb]);
  });

  prog.pushInt(m);
  pubkeys.forEach((k) => prog.pushRawBytes(k.raw));
  prog.pushInt(n);
  prog.pushOpcode(OpCode.checkmultisig);
  return prog;
}