/*
init alt stack [creater, taxRate, nftAsset, owner, marginAsset, marginAmount]
- buy data stack [buyer, payAmount, marginAmount, selecter]
+ buy data stack [buyer, marginAmount, selecter]
edit data stack [newMarginAsset, newMarginAmount, selecter]
*/
// data statck [...... selecter]
builder.AddJumpIf(0)
// alt stack [creater, taxRate, nftAsset, owner, marginAsset, marginAmount]
- // data statck [marginAsset, buyer, payAmount, marginAmount]
- builder.AddOp(vm.OP_SWAP)
+ // data statck [marginAsset, buyer, newMarginAmount]
+ cpAltStack(builder, 0)
+ builder.AddUint64(marginFold)
+ builder.AddOp(vm.OP_MUL)
+ // alt stack [creater, taxRate, nftAsset, owner, marginAsset, marginAmount]
+ // data statck [marginAsset, buyer, newMarginAmount, payAmount=marginAmount*marginFold]
builder.AddOp(vm.OP_DUP)
builder.AddUint64(100)
builder.AddOp(vm.OP_DIV)
builder.AddOp(vm.OP_SUB)
// alt stack [creater, taxRate, nftAsset, owner, marginAsset, marginAmount]
// data statck [marginAsset, buyer, newMarginAmount, ownerGot]
- builder.AddOp(vm.OP_DUP)
- cpAltStack(builder, 0)
- builder.AddUint64(marginFold)
- builder.AddOp(vm.OP_MUL)
- // alt stack [creater, taxRate, nftAsset, owner, marginAsset, marginAmount]
- // data statck [marginAsset, buyer, newMarginAmount, ownerGot, ownerGot, marginAmount*marginFold]
- builder.AddOp(vm.OP_GREATERTHANOREQUAL)
- builder.AddOp(vm.OP_VERIFY)
cpAltStack(builder, 0)
builder.AddOp(vm.OP_ADD)
// alt stack [creater, taxRate, nftAsset, owner, marginAsset, marginAmount]
}
}
-// 10个ETH质押被120个ETH买走, 然后被质押15个ETH
-func TestBuy(t *testing.T) {
+// 10个ETH质押被买走, 然后被质押15个ETH
+func TestRegularBuy(t *testing.T) {
contract, err := NewContract(platformScript, marginFold)
if err != nil {
t.Fatal(err)
arguments := [][]byte{
ETH.Bytes(),
buyerScirpt,
- vm.Uint64Bytes(120000000000),
vm.Uint64Bytes(15000000000),
vm.Uint64Bytes(0),
}
Inputs: []*types.TxInput{
types.NewSpendInput(arguments, utxoSourceID, nftAsset, 1, 0, contract, oldStateData),
types.NewSpendInput(arguments, utxoSourceID, ETH, 10000000000, 1, contract, oldStateData),
- types.NewSpendInput(nil, utxoSourceID, ETH, 135000000000, 2, anyCanSpendScript, nil),
+ types.NewSpendInput(nil, utxoSourceID, ETH, 115000000000, 2, anyCanSpendScript, nil),
types.NewSpendInput(nil, utxoSourceID, *consensus.BTMAssetID, 100000000, 1, anyCanSpendScript, nil),
},
Outputs: []*types.TxOutput{
types.NewOriginalTxOutput(nftAsset, 1, contract, newStateData),
types.NewOriginalTxOutput(ETH, 15000000000, contract, newStateData),
- types.NewOriginalTxOutput(ETH, 12000000000, createrScript, oldStateData),
- types.NewOriginalTxOutput(ETH, 1200000000, platformScript, oldStateData),
- types.NewOriginalTxOutput(ETH, 116800000000, ownerScirpt, oldStateData),
+ types.NewOriginalTxOutput(ETH, 10000000000, createrScript, oldStateData),
+ types.NewOriginalTxOutput(ETH, 1000000000, platformScript, oldStateData),
+ types.NewOriginalTxOutput(ETH, 99000000000, ownerScirpt, oldStateData),
},
})
}
}
-// 10个ETH质押被120个ETH买走, 然后被质押2个BTC
+// 10个ETH质押被买走, 然后被质押2个BTC
func TestBuySwapMargin(t *testing.T) {
contract, err := NewContract(platformScript, marginFold)
if err != nil {
arguments := [][]byte{
BTC.Bytes(),
buyerScirpt,
- vm.Uint64Bytes(120000000000),
vm.Uint64Bytes(200000000),
vm.Uint64Bytes(0),
}
Inputs: []*types.TxInput{
types.NewSpendInput(arguments, utxoSourceID, nftAsset, 1, 0, contract, oldStateData),
types.NewSpendInput(arguments, utxoSourceID, ETH, 10000000000, 1, contract, oldStateData),
- types.NewSpendInput(nil, utxoSourceID, ETH, 120000000000, 2, anyCanSpendScript, nil),
+ types.NewSpendInput(nil, utxoSourceID, ETH, 100000000000, 2, anyCanSpendScript, nil),
types.NewSpendInput(nil, utxoSourceID, BTC, 200000000, 3, anyCanSpendScript, nil),
types.NewSpendInput(nil, utxoSourceID, *consensus.BTMAssetID, 100000000, 1, anyCanSpendScript, nil),
},
Outputs: []*types.TxOutput{
types.NewOriginalTxOutput(nftAsset, 1, contract, newStateData),
types.NewOriginalTxOutput(BTC, 200000000, contract, newStateData),
- types.NewOriginalTxOutput(ETH, 12000000000, createrScript, oldStateData),
- types.NewOriginalTxOutput(ETH, 1200000000, platformScript, oldStateData),
- types.NewOriginalTxOutput(ETH, 116800000000, ownerScirpt, oldStateData),
+ types.NewOriginalTxOutput(ETH, 10000000000, createrScript, oldStateData),
+ types.NewOriginalTxOutput(ETH, 1000000000, platformScript, oldStateData),
+ types.NewOriginalTxOutput(ETH, 99000000000, ownerScirpt, oldStateData),
},
})
}
}
-// 10个ETH质押被120个ETH买走, 然后被质押15个ETH
+// 10个ETH质押被买走, 然后被质押15个ETH
func TestOfferBuy(t *testing.T) {
contract, err := NewContract(platformScript, marginFold)
if err != nil {
arguments := [][]byte{
ETH.Bytes(),
buyerScirpt,
- vm.Uint64Bytes(120000000000),
vm.Uint64Bytes(15000000000),
vm.Uint64Bytes(0),
}
Inputs: []*types.TxInput{
types.NewSpendInput(arguments, utxoSourceID, nftAsset, 1, 0, contract, oldStateData),
types.NewSpendInput(arguments, utxoSourceID, ETH, 10000000000, 1, contract, oldStateData),
- types.NewSpendInput([][]byte{vm.Uint64Bytes(1)}, utxoSourceID, ETH, 135000000000, 2, offer, newStateData),
+ types.NewSpendInput([][]byte{vm.Uint64Bytes(1)}, utxoSourceID, ETH, 115000000000, 2, offer, newStateData),
types.NewSpendInput(nil, utxoSourceID, *consensus.BTMAssetID, 100000000, 1, anyCanSpendScript, nil),
},
Outputs: []*types.TxOutput{
types.NewOriginalTxOutput(nftAsset, 1, contract, newStateData),
types.NewOriginalTxOutput(ETH, 15000000000, contract, newStateData),
- types.NewOriginalTxOutput(ETH, 12000000000, createrScript, oldStateData),
- types.NewOriginalTxOutput(ETH, 1200000000, platformScript, oldStateData),
- types.NewOriginalTxOutput(ETH, 116800000000, ownerScirpt, oldStateData),
+ types.NewOriginalTxOutput(ETH, 10000000000, createrScript, oldStateData),
+ types.NewOriginalTxOutput(ETH, 1000000000, platformScript, oldStateData),
+ types.NewOriginalTxOutput(ETH, 99000000000, ownerScirpt, oldStateData),
},
})