From 835bdfca48e26f3865486a23b8e51314f3946505 Mon Sep 17 00:00:00 2001 From: oysheng <33340252+oysheng@users.noreply.github.com> Date: Tue, 3 Jul 2018 15:48:23 +0800 Subject: [PATCH] add contract template escrow (#1117) --- cmd/bytomcli/commands/template.go | 75 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/cmd/bytomcli/commands/template.go b/cmd/bytomcli/commands/template.go index 9c5dde0b..384e9e42 100644 --- a/cmd/bytomcli/commands/template.go +++ b/cmd/bytomcli/commands/template.go @@ -6,11 +6,19 @@ import ( "github.com/bytom/errors" ) -var ( +const ( + // contract TradeOffer's clause clauseTrade = "00000000" clauseCancel = "13000000" tradeOfferEnding = "1a000000" + // contract Escrow's clause + clauseApprove = "00000000" + clauseReject = "1b000000" + escrowEnding = "2a000000" +) + +var ( errBadContractArguments = errors.New("bad contract arguments") ) @@ -114,6 +122,23 @@ var buildTradeOfferClauseCancelReqFmtByAlias = ` {"type": "spend_account", "asset_alias": "BTM", "amount": %s, "account_alias": "%s"} ]}` +// contract is Escrow +var buildEscrowReqFmt = ` + {"actions": [ + {"type": "spend_account_unspent_output", "output_id": "%s", "arguments": [{"type": "raw_tx_signature", "raw_data": {"xpub": "%s", "derivation_path": ["%s", "%s"]}}, + {"type": "data", "raw_data": {"value": "%s"}}]}, + {"type": "control_program", "asset_id": "%s", "amount": %s, "control_program": "%s"}, + {"type": "spend_account", "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "amount":%s, "account_id": "%s"} + ]}` + +var buildEscrowReqFmtByAlias = ` + {"actions": [ + {"type": "spend_account_unspent_output", "output_id":"%s", "arguments": [{"type": "raw_tx_signature", "raw_data": {"xpub": "%s", "derivation_path": ["%s", "%s"]}}, + {"type": "data", "raw_data": {"value": "%s"}}]}, + {"type": "control_program", "asset_alias": "%s", "amount": %s, "control_program": "%s"}, + {"type": "spend_account", "asset_alias": "BTM", "amount": %s, "account_alias": "%s"} + ]}` + // contract arguments type baseContractArg struct { accountInfo string @@ -234,6 +259,32 @@ func addContractArgs(contractName string, baseArg baseContractArg, specArgs []st err = errors.WithDetailf(errBadContractArguments, "selected clause [%s] error, contract %s's clause must in set [%s, %s, %s]\n", specArgs[0], contractName, clauseTrade, clauseCancel, tradeOfferEnding) } + + case "Escrow": + switch { + case len(specArgs) <= 0: + err = errors.WithDetailf(errBadContractArguments, "%s [flags]\n", usage) + case specArgs[0] == clauseApprove || specArgs[0] == clauseReject: + if len(specArgs) != 5 { + err = errors.WithDetailf(errBadContractArguments, "%s [flags]\n", usage) + return + } + + pubInfo := &basePubInfo{ + rootPub: specArgs[1], + path1: specArgs[2], + path2: specArgs[3], + } + controlProgram := specArgs[4] + buildReqStr, err = addEscrowArg(baseArg, specArgs[0], pubInfo, controlProgram) + + case specArgs[0] == escrowEnding: + err = errors.WithDetailf(errBadContractArguments, "Clause ending was selected in contract %s, ending exit\n", contractName) + default: + err = errors.WithDetailf(errBadContractArguments, "selected clause [%s] error, contract %s's clause must in set [%s, %s, %s]\n", + specArgs[0], contractName, clauseApprove, clauseReject, escrowEnding) + } + default: err = errors.WithDetailf(errBadContractArguments, "Invalid contract template name [%s]", contractName) } @@ -327,3 +378,25 @@ func addTradeOfferArg(baseArg baseContractArg, selector string, innerArg *innerC return } + +func addEscrowArg(baseArg baseContractArg, selector string, pubInfo *basePubInfo, controlProgram string) (buildReqStr string, err error) { + switch selector { + case clauseApprove, clauseReject: + if pubInfo == nil { + err = errors.New("Contract Escrow's clause argument is nil") + return + } + + buildReqStr = fmt.Sprintf(buildEscrowReqFmt, baseArg.outputID, pubInfo.rootPub, pubInfo.path1, pubInfo.path2, selector, + baseArg.assetInfo, baseArg.amount, controlProgram, baseArg.btmGas, baseArg.accountInfo) + if baseArg.alias { + buildReqStr = fmt.Sprintf(buildEscrowReqFmtByAlias, baseArg.outputID, pubInfo.rootPub, pubInfo.path1, pubInfo.path2, selector, + baseArg.assetInfo, baseArg.amount, controlProgram, baseArg.btmGas, baseArg.accountInfo) + } + + default: + err = errors.New("Invalid contract clause selector") + } + + return +} -- 2.11.0