From 08f5708edb516c4846dcd28d98f890f67a12b7c2 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Wed, 29 Apr 2020 10:49:09 +0300 Subject: [PATCH 1/5] core: remove Script attribute type --- integration/performance_test.go | 6 +---- pkg/core/blockchain.go | 11 --------- pkg/core/transaction/attr_usage.go | 1 - pkg/core/transaction/attribute.go | 4 +--- pkg/core/transaction/attrusage_string.go | 30 ++++++++++-------------- pkg/core/transaction/transaction.go | 8 ------- pkg/rpc/client/nep5.go | 11 +-------- 7 files changed, 16 insertions(+), 55 deletions(-) diff --git a/integration/performance_test.go b/integration/performance_test.go index f2768c68b..d5e80e03b 100644 --- a/integration/performance_test.go +++ b/integration/performance_test.go @@ -79,16 +79,12 @@ func getTX(t *testing.B, wif *keys.WIF) *transaction.Transaction { tx := transaction.NewInvocationTX([]byte{0x51}, 1) tx.Version = 0 + tx.Sender = fromAddressHash tx.Attributes = append(tx.Attributes, transaction.Attribute{ Usage: transaction.Description, Data: []byte(randString(10)), }) - tx.Attributes = append(tx.Attributes, - transaction.Attribute{ - Usage: transaction.Script, - Data: fromAddressHash.BytesBE(), - }) return tx } diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index 01b7b6dd8..7548803d9 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -1548,17 +1548,6 @@ func (bc *Blockchain) GetScriptHashesForVerifying(t *transaction.Transaction) ([ for i := range references { hashes[references[i].Out.ScriptHash] = true } - for _, a := range t.Attributes { - if a.Usage == transaction.Script { - h, err := util.Uint160DecodeBytesBE(a.Data) - if err != nil { - return nil, err - } - if _, ok := hashes[h]; !ok { - hashes[h] = true - } - } - } for a, outputs := range t.GroupOutputByAssetID() { as := bc.GetAssetState(a) diff --git a/pkg/core/transaction/attr_usage.go b/pkg/core/transaction/attr_usage.go index c9f8db22e..f430d32f0 100644 --- a/pkg/core/transaction/attr_usage.go +++ b/pkg/core/transaction/attr_usage.go @@ -10,7 +10,6 @@ const ( ContractHash AttrUsage = 0x00 ECDH02 AttrUsage = 0x02 ECDH03 AttrUsage = 0x03 - Script AttrUsage = 0x20 Vote AttrUsage = 0x30 CertURL AttrUsage = 0x80 DescriptionURL AttrUsage = 0x81 diff --git a/pkg/core/transaction/attribute.go b/pkg/core/transaction/attribute.go index ca4a0ed28..66fe97cb4 100644 --- a/pkg/core/transaction/attribute.go +++ b/pkg/core/transaction/attribute.go @@ -31,8 +31,6 @@ func (attr *Attribute) DecodeBinary(br *io.BinReader) { Hash6, Hash7, Hash8, Hash9, Hash10, Hash11, Hash12, Hash13, Hash14, Hash15: datasize = 32 - case Script: - datasize = 20 case DescriptionURL: // It's not VarUint as per C# implementation, dunno why var urllen = br.ReadB() @@ -62,7 +60,7 @@ func (attr *Attribute) EncodeBinary(bw *io.BinWriter) { case DescriptionURL: bw.WriteB(byte(len(attr.Data))) fallthrough - case Script, ContractHash, Vote, Hash1, Hash2, Hash3, Hash4, Hash5, Hash6, + case ContractHash, Vote, Hash1, Hash2, Hash3, Hash4, Hash5, Hash6, Hash7, Hash8, Hash9, Hash10, Hash11, Hash12, Hash13, Hash14, Hash15: bw.WriteBytes(attr.Data) default: diff --git a/pkg/core/transaction/attrusage_string.go b/pkg/core/transaction/attrusage_string.go index c0da95199..b63e1840e 100644 --- a/pkg/core/transaction/attrusage_string.go +++ b/pkg/core/transaction/attrusage_string.go @@ -11,7 +11,6 @@ func _() { _ = x[ContractHash-0] _ = x[ECDH02-2] _ = x[ECDH03-3] - _ = x[Script-32] _ = x[Vote-48] _ = x[CertURL-128] _ = x[DescriptionURL-129] @@ -52,19 +51,18 @@ func _() { const ( _AttrUsage_name_0 = "ContractHash" _AttrUsage_name_1 = "ECDH02ECDH03" - _AttrUsage_name_2 = "Script" - _AttrUsage_name_3 = "Vote" - _AttrUsage_name_4 = "CertURLDescriptionURL" - _AttrUsage_name_5 = "Description" - _AttrUsage_name_6 = "Hash1Hash2Hash3Hash4Hash5Hash6Hash7Hash8Hash9Hash10Hash11Hash12Hash13Hash14Hash15" - _AttrUsage_name_7 = "RemarkRemark1Remark2Remark3Remark4Remark5Remark6Remark7Remark8Remark9Remark10Remark11Remark12Remark13Remark14Remark15" + _AttrUsage_name_2 = "Vote" + _AttrUsage_name_3 = "CertURLDescriptionURL" + _AttrUsage_name_4 = "Description" + _AttrUsage_name_5 = "Hash1Hash2Hash3Hash4Hash5Hash6Hash7Hash8Hash9Hash10Hash11Hash12Hash13Hash14Hash15" + _AttrUsage_name_6 = "RemarkRemark1Remark2Remark3Remark4Remark5Remark6Remark7Remark8Remark9Remark10Remark11Remark12Remark13Remark14Remark15" ) var ( _AttrUsage_index_1 = [...]uint8{0, 6, 12} - _AttrUsage_index_4 = [...]uint8{0, 7, 21} - _AttrUsage_index_6 = [...]uint8{0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 51, 57, 63, 69, 75, 81} - _AttrUsage_index_7 = [...]uint8{0, 6, 13, 20, 27, 34, 41, 48, 55, 62, 69, 77, 85, 93, 101, 109, 117} + _AttrUsage_index_3 = [...]uint8{0, 7, 21} + _AttrUsage_index_5 = [...]uint8{0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 51, 57, 63, 69, 75, 81} + _AttrUsage_index_6 = [...]uint8{0, 6, 13, 20, 27, 34, 41, 48, 55, 62, 69, 77, 85, 93, 101, 109, 117} ) func (i AttrUsage) String() string { @@ -74,21 +72,19 @@ func (i AttrUsage) String() string { case 2 <= i && i <= 3: i -= 2 return _AttrUsage_name_1[_AttrUsage_index_1[i]:_AttrUsage_index_1[i+1]] - case i == 32: - return _AttrUsage_name_2 case i == 48: - return _AttrUsage_name_3 + return _AttrUsage_name_2 case 128 <= i && i <= 129: i -= 128 - return _AttrUsage_name_4[_AttrUsage_index_4[i]:_AttrUsage_index_4[i+1]] + return _AttrUsage_name_3[_AttrUsage_index_3[i]:_AttrUsage_index_3[i+1]] case i == 144: - return _AttrUsage_name_5 + return _AttrUsage_name_4 case 161 <= i && i <= 175: i -= 161 - return _AttrUsage_name_6[_AttrUsage_index_6[i]:_AttrUsage_index_6[i+1]] + return _AttrUsage_name_5[_AttrUsage_index_5[i]:_AttrUsage_index_5[i+1]] case 240 <= i && i <= 255: i -= 240 - return _AttrUsage_name_7[_AttrUsage_index_7[i]:_AttrUsage_index_7[i+1]] + return _AttrUsage_name_6[_AttrUsage_index_6[i]:_AttrUsage_index_6[i+1]] default: return "AttrUsage(" + strconv.FormatInt(int64(i), 10) + ")" } diff --git a/pkg/core/transaction/transaction.go b/pkg/core/transaction/transaction.go index 160270ed2..cc83cb086 100644 --- a/pkg/core/transaction/transaction.go +++ b/pkg/core/transaction/transaction.go @@ -107,14 +107,6 @@ func (t *Transaction) AddInput(in *Input) { t.Inputs = append(t.Inputs, *in) } -// AddVerificationHash adds a script attribute for transaction verification. -func (t *Transaction) AddVerificationHash(addr util.Uint160) { - t.Attributes = append(t.Attributes, Attribute{ - Usage: Script, - Data: addr.BytesBE(), - }) -} - // DecodeBinary implements Serializable interface. func (t *Transaction) DecodeBinary(br *io.BinReader) { t.Type = TXType(br.ReadB()) diff --git a/pkg/rpc/client/nep5.go b/pkg/rpc/client/nep5.go index e16f6ed20..5535d34e8 100644 --- a/pkg/rpc/client/nep5.go +++ b/pkg/rpc/client/nep5.go @@ -108,22 +108,13 @@ func (c *Client) TransferNEP5(acc *wallet.Account, to util.Uint160, token *walle emit.Opcode(w.BinWriter, opcode.THROWIFNOT) tx := transaction.NewInvocationTX(w.Bytes(), gas) - tx.Attributes = append(tx.Attributes, transaction.Attribute{ - Usage: transaction.Script, - Data: from.BytesBE(), - }) + tx.Sender = from tx.ValidUntilBlock, err = c.CalculateValidUntilBlock() if err != nil { return util.Uint256{}, fmt.Errorf("can't calculate validUntilBlock: %v", err) } - addr, err := address.StringToUint160(acc.Address) - if err != nil { - return util.Uint256{}, fmt.Errorf("failed to get address: %v", err) - } - tx.Sender = addr - if err := request.AddInputsAndUnspentsToTx(tx, acc.Address, core.UtilityTokenID(), gas, c); err != nil { return util.Uint256{}, fmt.Errorf("can't add GAS to transaction: %v", err) } From d1ec01c45e0787bae9b544d190c155c589d6cb6e Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Mon, 4 May 2020 10:35:56 +0300 Subject: [PATCH 2/5] util: implement Serializable interface over Uint160 --- pkg/core/state/account.go | 4 ++-- pkg/core/state/asset.go | 12 ++++++------ pkg/core/state/notification_event.go | 4 ++-- pkg/core/transaction/register.go | 4 ++-- pkg/core/transaction/transaction.go | 4 ++-- pkg/util/uint160.go | 12 ++++++++++++ 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/pkg/core/state/account.go b/pkg/core/state/account.go index 2fc3a4f66..4e65ec27e 100644 --- a/pkg/core/state/account.go +++ b/pkg/core/state/account.go @@ -49,7 +49,7 @@ func NewAccount(scriptHash util.Uint160) *Account { // DecodeBinary decodes Account from the given BinReader. func (s *Account) DecodeBinary(br *io.BinReader) { s.Version = uint8(br.ReadB()) - br.ReadBytes(s.ScriptHash[:]) + s.ScriptHash.DecodeBinary(br) s.IsFrozen = br.ReadBool() s.Balances = make(map[util.Uint256][]UnspentBalance) @@ -73,7 +73,7 @@ func (s *Account) DecodeBinary(br *io.BinReader) { // EncodeBinary encodes Account to the given BinWriter. func (s *Account) EncodeBinary(bw *io.BinWriter) { bw.WriteB(byte(s.Version)) - bw.WriteBytes(s.ScriptHash[:]) + s.ScriptHash.EncodeBinary(bw) bw.WriteBool(s.IsFrozen) bw.WriteVarUint(uint64(len(s.Balances))) diff --git a/pkg/core/state/asset.go b/pkg/core/state/asset.go index 0b624516b..d59deba68 100644 --- a/pkg/core/state/asset.go +++ b/pkg/core/state/asset.go @@ -37,11 +37,11 @@ func (a *Asset) DecodeBinary(br *io.BinReader) { a.Available.DecodeBinary(br) a.Precision = uint8(br.ReadB()) a.FeeMode = uint8(br.ReadB()) - br.ReadBytes(a.FeeAddress[:]) + a.FeeAddress.DecodeBinary(br) a.Owner.DecodeBinary(br) - br.ReadBytes(a.Admin[:]) - br.ReadBytes(a.Issuer[:]) + a.Admin.DecodeBinary(br) + a.Issuer.DecodeBinary(br) a.Expiration = br.ReadU32LE() a.IsFrozen = br.ReadBool() } @@ -55,12 +55,12 @@ func (a *Asset) EncodeBinary(bw *io.BinWriter) { a.Available.EncodeBinary(bw) bw.WriteB(byte(a.Precision)) bw.WriteB(byte(a.FeeMode)) - bw.WriteBytes(a.FeeAddress[:]) + a.FeeAddress.EncodeBinary(bw) a.Owner.EncodeBinary(bw) - bw.WriteBytes(a.Admin[:]) - bw.WriteBytes(a.Issuer[:]) + a.Admin.EncodeBinary(bw) + a.Issuer.EncodeBinary(bw) bw.WriteU32LE(a.Expiration) bw.WriteBool(a.IsFrozen) } diff --git a/pkg/core/state/notification_event.go b/pkg/core/state/notification_event.go index 2599f781e..06e634464 100644 --- a/pkg/core/state/notification_event.go +++ b/pkg/core/state/notification_event.go @@ -28,13 +28,13 @@ type AppExecResult struct { // EncodeBinary implements the Serializable interface. func (ne *NotificationEvent) EncodeBinary(w *io.BinWriter) { - w.WriteBytes(ne.ScriptHash[:]) + ne.ScriptHash.EncodeBinary(w) vm.EncodeBinaryStackItem(ne.Item, w) } // DecodeBinary implements the Serializable interface. func (ne *NotificationEvent) DecodeBinary(r *io.BinReader) { - r.ReadBytes(ne.ScriptHash[:]) + ne.ScriptHash.DecodeBinary(r) ne.Item = vm.DecodeBinaryStackItem(r) } diff --git a/pkg/core/transaction/register.go b/pkg/core/transaction/register.go index 0351b040d..c17eccb26 100644 --- a/pkg/core/transaction/register.go +++ b/pkg/core/transaction/register.go @@ -57,7 +57,7 @@ func (tx *RegisterTX) DecodeBinary(br *io.BinReader) { tx.Owner.DecodeBinary(br) - br.ReadBytes(tx.Admin[:]) + tx.Admin.DecodeBinary(br) } // EncodeBinary implements Serializable interface. @@ -67,7 +67,7 @@ func (tx *RegisterTX) EncodeBinary(bw *io.BinWriter) { tx.Amount.EncodeBinary(bw) bw.WriteB(byte(tx.Precision)) bw.WriteBytes(tx.Owner.Bytes()) - bw.WriteBytes(tx.Admin[:]) + tx.Admin.EncodeBinary(bw) } // registeredAsset is a wrapper for RegisterTransaction diff --git a/pkg/core/transaction/transaction.go b/pkg/core/transaction/transaction.go index cc83cb086..185ee1e57 100644 --- a/pkg/core/transaction/transaction.go +++ b/pkg/core/transaction/transaction.go @@ -112,7 +112,7 @@ func (t *Transaction) DecodeBinary(br *io.BinReader) { t.Type = TXType(br.ReadB()) t.Version = uint8(br.ReadB()) t.Nonce = br.ReadU32LE() - br.ReadBytes(t.Sender[:]) + t.Sender.DecodeBinary(br) t.ValidUntilBlock = br.ReadU32LE() t.decodeData(br) @@ -174,7 +174,7 @@ func (t *Transaction) encodeHashableFields(bw *io.BinWriter) { bw.WriteB(byte(t.Type)) bw.WriteB(byte(t.Version)) bw.WriteU32LE(t.Nonce) - bw.WriteBytes(t.Sender[:]) + t.Sender.EncodeBinary(bw) bw.WriteU32LE(t.ValidUntilBlock) // Underlying TXer. diff --git a/pkg/util/uint160.go b/pkg/util/uint160.go index 1e457d323..736d1fe78 100644 --- a/pkg/util/uint160.go +++ b/pkg/util/uint160.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" "strings" + + "github.com/nspcc-dev/neo-go/pkg/io" ) // Uint160Size is the size of Uint160 in bytes. @@ -131,3 +133,13 @@ func (u *Uint160) UnmarshalJSON(data []byte) (err error) { func (u Uint160) MarshalJSON() ([]byte, error) { return []byte(`"0x` + u.StringLE() + `"`), nil } + +// EncodeBinary implements Serializable interface. +func (u *Uint160) EncodeBinary(bw *io.BinWriter) { + bw.WriteBytes(u[:]) +} + +// DecodeBinary implements Serializable interface. +func (u *Uint160) DecodeBinary(br *io.BinReader) { + br.ReadBytes(u[:]) +} From 9ecac14aee50ab608159afff5878f6be782f5c74 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Thu, 30 Apr 2020 19:19:31 +0300 Subject: [PATCH 3/5] vm: fix bug in GetContextScriptHash() v.Istack.Peek(n) can return nil pointer, so .Value() on this pointer leads to panic here. Fixed by adding nil check. --- pkg/vm/context.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/vm/context.go b/pkg/vm/context.go index 4d1b9c00e..14b039dfd 100644 --- a/pkg/vm/context.go +++ b/pkg/vm/context.go @@ -226,7 +226,11 @@ func (c *Context) String() string { // GetContextScriptHash returns script hash of the invocation stack element // number n. func (v *VM) GetContextScriptHash(n int) util.Uint160 { - ctxIface := v.Istack().Peek(n).Value() + element := v.Istack().Peek(n) + if element == nil { + return util.Uint160{} + } + ctxIface := element.Value() ctx := ctxIface.(*Context) return ctx.ScriptHash() } From 73167999cce30e11182e3e156b5e5ec833889442 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Thu, 30 Apr 2020 16:00:33 +0300 Subject: [PATCH 4/5] core: add cosigners field to transaction closes #864 --- pkg/core/blockchain.go | 3 + pkg/core/interop/runtime/witness.go | 63 ++++++++- pkg/core/interop_neo.go | 2 +- pkg/core/native/native_neo.go | 23 ++- pkg/core/transaction/claim.go | 1 + pkg/core/transaction/contract.go | 1 + pkg/core/transaction/cosigner.go | 42 ++++++ pkg/core/transaction/cosigner_test.go | 28 ++++ pkg/core/transaction/invocation.go | 1 + pkg/core/transaction/issue.go | 1 + pkg/core/transaction/register.go | 1 + pkg/core/transaction/transaction.go | 23 +++ pkg/core/transaction/witness_scope.go | 19 +++ pkg/core/util_test.go | 6 +- pkg/rpc/client/rpc_test.go | 187 +++++++++++++++++-------- pkg/rpc/server/server_test.go | 18 +-- pkg/rpc/server/testdata/testblocks.acc | Bin 113856 -> 113865 bytes pkg/vm/vm.go | 22 +++ 18 files changed, 363 insertions(+), 78 deletions(-) create mode 100644 pkg/core/transaction/cosigner.go create mode 100644 pkg/core/transaction/cosigner_test.go create mode 100644 pkg/core/transaction/witness_scope.go diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index 7548803d9..ce6e19c2d 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -1564,6 +1564,9 @@ func (bc *Blockchain) GetScriptHashesForVerifying(t *transaction.Transaction) ([ } } hashes[t.Sender] = true + for _, c := range t.Cosigners { + hashes[c.Account] = true + } switch t.Type { case transaction.ClaimType: claim := t.Data.(*transaction.ClaimTX) diff --git a/pkg/core/interop/runtime/witness.go b/pkg/core/interop/runtime/witness.go index 1f1dd58f6..094737bef 100644 --- a/pkg/core/interop/runtime/witness.go +++ b/pkg/core/interop/runtime/witness.go @@ -2,6 +2,7 @@ package runtime import ( "github.com/nspcc-dev/neo-go/pkg/core/interop" + "github.com/nspcc-dev/neo-go/pkg/core/transaction" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/vm" @@ -10,7 +11,12 @@ import ( // CheckHashedWitness checks given hash against current list of script hashes // for verifying in the interop context. -func CheckHashedWitness(ic *interop.Context, hash util.Uint160) (bool, error) { +func CheckHashedWitness(ic *interop.Context, v vm.ScriptHashGetter, hash util.Uint160) (bool, error) { + if tx, ok := ic.Container.(*transaction.Transaction); ok { + return checkScope(tx, v, hash) + } + + // only for non-Transaction types (Block, etc.) hashes, err := ic.Chain.GetScriptHashesForVerifying(ic.Tx) if err != nil { return false, errors.Wrap(err, "failed to get script hashes") @@ -23,10 +29,57 @@ func CheckHashedWitness(ic *interop.Context, hash util.Uint160) (bool, error) { return false, nil } +func checkScope(tx *transaction.Transaction, v vm.ScriptHashGetter, hash util.Uint160) (bool, error) { + for _, c := range tx.Cosigners { + if c.Account == hash { + if c.Scopes == transaction.Global { + return true, nil + } + if c.Scopes&transaction.CalledByEntry != 0 { + callingScriptHash := v.GetCallingScriptHash() + entryScriptHash := v.GetEntryScriptHash() + if callingScriptHash == entryScriptHash { + return true, nil + } + } + if c.Scopes&transaction.CustomContracts != 0 { + currentScriptHash := v.GetCurrentScriptHash() + for _, allowedContract := range c.AllowedContracts { + if allowedContract == currentScriptHash { + return true, nil + } + } + } + if c.Scopes&transaction.CustomGroups != 0 { + return true, nil + // TODO: we don't currently have Manifest field in ContractState + /*callingScriptHash := v.GetCallingScriptHash() + if callingScriptHash.Equals(util.Uint160{}){ + return false, nil + } + cs, err := ic.DAO.GetContractState(callingScriptHash) + if err != nil { + return false, err + } + // check if the current group is the required one + for _, allowedGroup := range c.AllowedGroups { + for _, group := range cs.Manifest.Groups { + if group.PublicKey.Equal(allowedGroup) { + return true, nil + } + } + }*/ + } + return false, nil + } + } + return false, nil +} + // CheckKeyedWitness checks hash of signature check contract with a given public // key against current list of script hashes for verifying in the interop context. -func CheckKeyedWitness(ic *interop.Context, key *keys.PublicKey) (bool, error) { - return CheckHashedWitness(ic, key.GetScriptHash()) +func CheckKeyedWitness(ic *interop.Context, v vm.ScriptHashGetter, key *keys.PublicKey) (bool, error) { + return CheckHashedWitness(ic, v, key.GetScriptHash()) } // CheckWitness checks witnesses. @@ -42,9 +95,9 @@ func CheckWitness(ic *interop.Context, v *vm.VM) error { if err != nil { return errors.New("parameter given is neither a key nor a hash") } - res, err = CheckKeyedWitness(ic, key) + res, err = CheckKeyedWitness(ic, v, key) } else { - res, err = CheckHashedWitness(ic, hash) + res, err = CheckHashedWitness(ic, v, hash) } if err != nil { return errors.Wrap(err, "failed to check") diff --git a/pkg/core/interop_neo.go b/pkg/core/interop_neo.go index 6dcc1f9b9..e8dfda15d 100644 --- a/pkg/core/interop_neo.go +++ b/pkg/core/interop_neo.go @@ -601,7 +601,7 @@ func assetCreate(ic *interop.Context, v *vm.VM) error { if owner.IsInfinity() { return errors.New("can't have infinity as an owner key") } - witnessOk, err := runtime.CheckKeyedWitness(ic, owner) + witnessOk, err := runtime.CheckKeyedWitness(ic, v, owner) if err != nil { return err } diff --git a/pkg/core/native/native_neo.go b/pkg/core/native/native_neo.go index f159b18ad..cd35e942a 100644 --- a/pkg/core/native/native_neo.go +++ b/pkg/core/native/native_neo.go @@ -251,7 +251,7 @@ func (n *NEO) vote(ic *interop.Context, args []vm.StackItem) vm.StackItem { // VoteInternal votes from account h for validarors specified in pubs. func (n *NEO) VoteInternal(ic *interop.Context, h util.Uint160, pubs keys.PublicKeys) error { - ok, err := runtime.CheckHashedWitness(ic, h) + ok, err := runtime.CheckHashedWitness(ic, neoScriptHash{hash: n.Hash}, h) if err != nil { return err } else if !ok { @@ -479,3 +479,24 @@ func toPublicKey(s vm.StackItem) *keys.PublicKey { } return pub } + +// scriptHash is an auxiliary structure which implements ScriptHashGetter +// interface over NEO native contract and is used for runtime.CheckHashedWitness +type neoScriptHash struct { + hash util.Uint160 +} + +// GetCallingScriptHash implements ScriptHashGetter interface +func (s neoScriptHash) GetCallingScriptHash() util.Uint160 { + return util.Uint160{} +} + +// GetEntryScriptHash implements ScriptHashGetter interface +func (s neoScriptHash) GetEntryScriptHash() util.Uint160 { + return s.hash +} + +// GetCurrentScriptHash implements ScriptHashGetter interface +func (s neoScriptHash) GetCurrentScriptHash() util.Uint160 { + return s.hash +} diff --git a/pkg/core/transaction/claim.go b/pkg/core/transaction/claim.go index 67cb2f3a0..704d9035b 100644 --- a/pkg/core/transaction/claim.go +++ b/pkg/core/transaction/claim.go @@ -19,6 +19,7 @@ func NewClaimTX(claim *ClaimTX) *Transaction { Nonce: rand.Uint32(), Data: claim, Attributes: []Attribute{}, + Cosigners: []Cosigner{}, Inputs: []Input{}, Outputs: []Output{}, Scripts: []Witness{}, diff --git a/pkg/core/transaction/contract.go b/pkg/core/transaction/contract.go index 09b6a9063..c4a99a1cf 100644 --- a/pkg/core/transaction/contract.go +++ b/pkg/core/transaction/contract.go @@ -18,6 +18,7 @@ func NewContractTX() *Transaction { Nonce: rand.Uint32(), Data: &ContractTX{}, Attributes: []Attribute{}, + Cosigners: []Cosigner{}, Inputs: []Input{}, Outputs: []Output{}, Scripts: []Witness{}, diff --git a/pkg/core/transaction/cosigner.go b/pkg/core/transaction/cosigner.go new file mode 100644 index 000000000..4dbe8a4fa --- /dev/null +++ b/pkg/core/transaction/cosigner.go @@ -0,0 +1,42 @@ +package transaction + +import ( + "github.com/nspcc-dev/neo-go/pkg/crypto/keys" + "github.com/nspcc-dev/neo-go/pkg/io" + "github.com/nspcc-dev/neo-go/pkg/util" +) + +// The maximum number of AllowedContracts or AllowedGroups +const maxSubitems = 16 + +// Cosigner implements a Transaction cosigner. +type Cosigner struct { + Account util.Uint160 `json:"account"` + Scopes WitnessScope `json:"scopes"` + AllowedContracts []util.Uint160 `json:"allowedContracts,omitempty"` + AllowedGroups []*keys.PublicKey `json:"allowedGroups,omitempty"` +} + +// EncodeBinary implements Serializable interface. +func (c *Cosigner) EncodeBinary(bw *io.BinWriter) { + bw.WriteBytes(c.Account[:]) + bw.WriteB(byte(c.Scopes)) + if c.Scopes&CustomContracts != 0 { + bw.WriteArray(c.AllowedContracts) + } + if c.Scopes&CustomGroups != 0 { + bw.WriteArray(c.AllowedGroups) + } +} + +// DecodeBinary implements Serializable interface. +func (c *Cosigner) DecodeBinary(br *io.BinReader) { + br.ReadBytes(c.Account[:]) + c.Scopes = WitnessScope(br.ReadB()) + if c.Scopes&CustomContracts != 0 { + br.ReadArray(&c.AllowedContracts, maxSubitems) + } + if c.Scopes&CustomGroups != 0 { + br.ReadArray(&c.AllowedGroups, maxSubitems) + } +} diff --git a/pkg/core/transaction/cosigner_test.go b/pkg/core/transaction/cosigner_test.go new file mode 100644 index 000000000..a8789f0b9 --- /dev/null +++ b/pkg/core/transaction/cosigner_test.go @@ -0,0 +1,28 @@ +package transaction + +import ( + "testing" + + "github.com/nspcc-dev/neo-go/pkg/internal/testserdes" + "github.com/nspcc-dev/neo-go/pkg/util" +) + +func TestCosignerEncodeDecode(t *testing.T) { + expected := &Cosigner{ + Account: util.Uint160{1, 2, 3, 4, 5}, + Scopes: CustomContracts, + AllowedContracts: []util.Uint160{{1, 2, 3, 4}, {6, 7, 8, 9}}, + } + actual := &Cosigner{} + testserdes.EncodeDecodeBinary(t, expected, actual) +} + +func TestCosignerMarshallUnmarshallJSON(t *testing.T) { + expected := &Cosigner{ + Account: util.Uint160{1, 2, 3, 4, 5}, + Scopes: CustomContracts, + AllowedContracts: []util.Uint160{{1, 2, 3, 4}, {6, 7, 8, 9}}, + } + actual := &Cosigner{} + testserdes.MarshalUnmarshalJSON(t, expected, actual) +} diff --git a/pkg/core/transaction/invocation.go b/pkg/core/transaction/invocation.go index 2b934c772..9abb7b1a9 100644 --- a/pkg/core/transaction/invocation.go +++ b/pkg/core/transaction/invocation.go @@ -31,6 +31,7 @@ func NewInvocationTX(script []byte, gas util.Fixed8) *Transaction { Version: 1, }, Attributes: []Attribute{}, + Cosigners: []Cosigner{}, Inputs: []Input{}, Outputs: []Output{}, Scripts: []Witness{}, diff --git a/pkg/core/transaction/issue.go b/pkg/core/transaction/issue.go index 151d96af7..d2ab6034f 100644 --- a/pkg/core/transaction/issue.go +++ b/pkg/core/transaction/issue.go @@ -18,6 +18,7 @@ func NewIssueTX() *Transaction { Nonce: rand.Uint32(), Data: &IssueTX{}, Attributes: []Attribute{}, + Cosigners: []Cosigner{}, Inputs: []Input{}, Outputs: []Output{}, Scripts: []Witness{}, diff --git a/pkg/core/transaction/register.go b/pkg/core/transaction/register.go index c17eccb26..9bff3efbe 100644 --- a/pkg/core/transaction/register.go +++ b/pkg/core/transaction/register.go @@ -39,6 +39,7 @@ func NewRegisterTX(register *RegisterTX) *Transaction { Nonce: rand.Uint32(), Data: register, Attributes: []Attribute{}, + Cosigners: []Cosigner{}, Inputs: []Input{}, Outputs: []Output{}, Scripts: []Witness{}, diff --git a/pkg/core/transaction/transaction.go b/pkg/core/transaction/transaction.go index 185ee1e57..e2e399c2a 100644 --- a/pkg/core/transaction/transaction.go +++ b/pkg/core/transaction/transaction.go @@ -19,6 +19,9 @@ const ( // MaxValidUntilBlockIncrement is the upper increment size of blockhain height in blocs after // exceeding that a transaction should fail validation. It is set to be 2102400. MaxValidUntilBlockIncrement = 2102400 + // MaxCosigners is maximum number of cosigners that can be contained within a transaction. + // It is set to be 16. + MaxCosigners = 16 ) // Transaction is a process recorded in the NEO blockchain. @@ -46,6 +49,9 @@ type Transaction struct { // Transaction attributes. Attributes []Attribute + // Transaction cosigners (not include Sender). + Cosigners []Cosigner + // The inputs of the transaction. Inputs []Input @@ -118,6 +124,17 @@ func (t *Transaction) DecodeBinary(br *io.BinReader) { t.decodeData(br) br.ReadArray(&t.Attributes) + + br.ReadArray(&t.Cosigners, MaxCosigners) + for i := 0; i < len(t.Cosigners); i++ { + for j := i + 1; j < len(t.Cosigners); j++ { + if t.Cosigners[i].Account.Equals(t.Cosigners[j].Account) { + br.Err = errors.New("transaction cosigners should be unique") + return + } + } + } + br.ReadArray(&t.Inputs) br.ReadArray(&t.Outputs) for i := range t.Outputs { @@ -185,6 +202,9 @@ func (t *Transaction) encodeHashableFields(bw *io.BinWriter) { // Attributes bw.WriteArray(t.Attributes) + // Cosigners + bw.WriteArray(t.Cosigners) + // Inputs bw.WriteArray(t.Inputs) @@ -259,6 +279,7 @@ type transactionJSON struct { Sender string `json:"sender"` ValidUntilBlock uint32 `json:"valid_until_block"` Attributes []Attribute `json:"attributes"` + Cosigners []Cosigner `json:"cosigners"` Inputs []Input `json:"vin"` Outputs []Output `json:"vout"` Scripts []Witness `json:"scripts"` @@ -280,6 +301,7 @@ func (t *Transaction) MarshalJSON() ([]byte, error) { Sender: address.Uint160ToString(t.Sender), ValidUntilBlock: t.ValidUntilBlock, Attributes: t.Attributes, + Cosigners: t.Cosigners, Inputs: t.Inputs, Outputs: t.Outputs, Scripts: t.Scripts, @@ -315,6 +337,7 @@ func (t *Transaction) UnmarshalJSON(data []byte) error { t.Nonce = tx.Nonce t.ValidUntilBlock = tx.ValidUntilBlock t.Attributes = tx.Attributes + t.Cosigners = tx.Cosigners t.Inputs = tx.Inputs t.Outputs = tx.Outputs t.Scripts = tx.Scripts diff --git a/pkg/core/transaction/witness_scope.go b/pkg/core/transaction/witness_scope.go new file mode 100644 index 000000000..751347148 --- /dev/null +++ b/pkg/core/transaction/witness_scope.go @@ -0,0 +1,19 @@ +package transaction + +// WitnessScope represents set of witness flags for Transaction cosigner. +type WitnessScope byte + +const ( + // Global allows this witness in all contexts (default Neo2 behavior). + // This cannot be combined with other flags. + Global WitnessScope = 0x00 + // CalledByEntry means that this condition must hold: EntryScriptHash == CallingScriptHash. + // No params is needed, as the witness/permission/signature given on first invocation will + // automatically expire if entering deeper internal invokes. This can be default safe + // choice for native NEO/GAS (previously used on Neo 2 as "attach" mode). + CalledByEntry WitnessScope = 0x01 + // CustomContracts define custom hash for contract-specific. + CustomContracts WitnessScope = 0x10 + // CustomGroups define custom pubkey for group members. + CustomGroups WitnessScope = 0x20 +) diff --git a/pkg/core/util_test.go b/pkg/core/util_test.go index 5bf66555d..1c66de845 100644 --- a/pkg/core/util_test.go +++ b/pkg/core/util_test.go @@ -20,7 +20,7 @@ func TestGenesisBlockMainNet(t *testing.T) { // have been changed. Consequently, hash of the genesis block has been changed. // Update expected genesis block hash for better times. // Old hash is "d42561e3d30e15be6400b6df2f328e02d2bf6354c41dce433bc57687c82144bf" - expect := "16ffda4cc6a9b0a0ca63f1571f7724418c43f014e2eb4e8614b4938ccf0f20f6" + expect := "8eb36fe47f07a795a1783a9f066603db66c5b76cf878650b1e137c114f46c0cc" assert.Equal(t, expect, block.Hash().StringLE()) } @@ -47,7 +47,7 @@ func TestUtilityTokenTX(t *testing.T) { //TODO: After we added Nonce field to transaction.Transaction, UtilityTockenTx hash // has been changed. Update it for better times. // Old hash is "602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7" - expect := "b16384a950ed01ed5fc15c03fe7b98228871cb43b1bc22d67029449fc854d104" + expect := "8ef63ccd6f4ea20a93e7f4e84b2d43f778077612b241d617e42e1750cca4f2c5" assert.Equal(t, expect, UtilityTokenID().StringLE()) } @@ -55,6 +55,6 @@ func TestGoverningTokenTX(t *testing.T) { //TODO: After we added Nonce field to transaction.Transaction, GoveringTockenTx hash // has been changed. Update it for better times. // Old hash is "c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b" - expect := "7a37715546c6cfa5bac8d7f7e87c667a1e5a6ba0601238be475ab8c79a5abcf5" + expect := "7dc12f8835b085d468ddbab3f7152c0e2f5679b5815b2028685abb4608e7b7dc" assert.Equal(t, expect, GoverningTokenID().StringLE()) } diff --git a/pkg/rpc/client/rpc_test.go b/pkg/rpc/client/rpc_test.go index d56168c28..6a4b1aba8 100644 --- a/pkg/rpc/client/rpc_test.go +++ b/pkg/rpc/client/rpc_test.go @@ -38,7 +38,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ invoke: func(c *Client) (interface{}, error) { return c.GetAccountState("") }, - serverResponse: `{"jsonrpc":"2.0","id": 1,"result":{"version":0,"script_hash":"0x1179716da2e9523d153a35fb3ad10c561b1e5b1a","frozen":false,"votes":[],"balances":[{"asset":"0x7a37715546c6cfa5bac8d7f7e87c667a1e5a6ba0601238be475ab8c79a5abcf5","value":"94"}]}}`, + serverResponse: `{"jsonrpc":"2.0","id": 1,"result":{"version":0,"script_hash":"0x1179716da2e9523d153a35fb3ad10c561b1e5b1a","frozen":false,"votes":[],"balances":[{"asset":"0x7dc12f8835b085d468ddbab3f7152c0e2f5679b5815b2028685abb4608e7b7dc","value":"94"}]}}`, result: func(c *Client) interface{} { scriptHash, err := util.Uint160DecodeStringLE("1179716da2e9523d153a35fb3ad10c561b1e5b1a") if err != nil { @@ -96,7 +96,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ invoke: func(c *Client) (interface{}, error) { return c.GetAssetState(util.Uint256{}) }, - serverResponse: `{"id":1,"jsonrpc":"2.0","result":{"id":"0x7a37715546c6cfa5bac8d7f7e87c667a1e5a6ba0601238be475ab8c79a5abcf5","type":0,"name":"NEO","amount":"100000000","available":"100000000","precision":0,"owner":"00","admin":"Abf2qMs1pzQb8kYk9RuxtUb9jtRKJVuBJt","issuer":"AFmseVrdL9f9oyCzZefL9tG6UbvhPbdYzM","expiration":4000000,"is_frozen":false}}`, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":{"id":"0x7dc12f8835b085d468ddbab3f7152c0e2f5679b5815b2028685abb4608e7b7dc","type":0,"name":"NEO","amount":"100000000","available":"100000000","precision":0,"owner":"00","admin":"Abf2qMs1pzQb8kYk9RuxtUb9jtRKJVuBJt","issuer":"AFmseVrdL9f9oyCzZefL9tG6UbvhPbdYzM","expiration":4000000,"is_frozen":false}}`, result: func(c *Client) interface{} { return &result.AssetState{ ID: core.GoverningTokenID(), @@ -134,45 +134,45 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ { name: "byIndex_positive", invoke: func(c *Client) (interface{}, error) { - return c.GetBlockByIndex(5) + return c.GetBlockByIndex(202) }, - serverResponse: `{"id":1,"jsonrpc":"2.0","result":"000000005b25cf560918b13cc7a10071cf616426a103d58498171567aaa116af69179aa3c05c359ade4316392d69d5ca01f8860f8bdebbe1a8f752edd68d9a6a2d204fe752cca25e0000000005000000e903736ceceeceae1806eee0e3ec61e7cce476ce01fd08010c407f70912fdcd0ce9a70963110eb39ef73ed02512ea63bc1c55577474df8f364a874999b16666888f8a3ca69873054a31ab42dd1fee1ed8605ff65edb39797e34e0c40d59459cb1cc8270d9a813aa444852a5d7714aed0b25373ec07549349c6db32b6c8c2e43cdd7b1ad2a4154cb5ff1222d9d7010877016a59775abdd2c08f253c850c4048b65cb58e0d58f2dd0f5db3b195c5784933d6179d8317217ba46f9deac9a667bffb1afd0dd86bdae6267af4c2605f7401849a0b980fcecfeae95df7f5ca6e140c406d9b1942c5aa80070ad484b3dd76421a3f46327670bea94e3ecb3a94eef8843a75195b55872a7c503acb01ab368cdaa11a9e5fb80d55bbd6b861233ba84edcf894130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb020057040000000000008000d5040000e903736ceceeceae1806eee0e3ec61e7cce476ce0500000000000001fd08010c40ae62dadb95b21628921adb9ee14e8c1f20d68b9d6ffba218f8e403af70126449435a53525cd6f1d1c871e64a91025866cd8a413ec70e3cde0ddf62931aa22baa0c40c3e09fc8ad46789d645240634ef40bd180e0dba75beae07a37dc2e899b68b4b3b3a67d076ea9444ed143dbb3264702914a4662ff95859d32c9b5bb5bdc9ec1d60c40b2511115482bd860d85f57103fb8cce2cb45ba8461d4e164685b426cb5df1525e6f09dd7aa23db0fec2241bde7c925e22f3cba3824ea461455515dc2a1455f5e0c40c0aee2528e7fd75a0434f4d67da58507e8d349ca29e01e7eafa9f283e8b8c05d06587db7234f111730c14c8a4bfb7a1ffd9493b9696c71e68966c6bf4a832ab794130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb"}`, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":"0000000039f06b13aa6ee24d37db9b7868533b7988a6fb1e59c3fa6677dab7fd1f51326405f4fa24f061ffa04ab3127994530ee04c5e578a7b8109133dd142b6a31192cd9debaa5e00000000ca000000e903736ceceeceae1806eee0e3ec61e7cce476ce01fd08010c404617b6788538326383015c44ffddd4a05a4e200b65a26fc84234ae8b1e28ef27b7f139dc498c58071193d530ba83081701290eba8f7108397499f5556c16e3780c402131f2bdcc494c73a379e86c46f9e9fe9899a05b23928926b1eaaf816928e160fe971b82263aa1e7efa5f7e46bf99de735fc4fc5aeb81edfdc6a9b2e9fcfa1000c408cbae1582bb9d82de9ff030b8c729737f2157844c0ca29edcdbfed1dd5e2473e0061f0dc29412477417e2c1f7c55443f11b9bd6e0d0856d1ec00240be1b9b9a70c4034d1055531cf0522ac7e5dcd817cf3cd86997ae38da806dc789b1f16eb0005f00b9bc29f7372bb43a8fed040c6763b162c8a0d8e2d0b2d7476e22e0b2b77601094130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb0200570400000000000080000300000075a94799633ed955dd85a8af314a5b435ab51903b0040000000001f6c31d4dd9edf7aea24168885ae82dc574d25e35a9b9b3063f3ea44226a3081f000001dcb7e70846bb5a6828205b81b579562f0e2c15f7b3badd68d485b035882fc17d00184a27db86230075a94799633ed955dd85a8af314a5b435ab5190301420c40bfce1ead7d53339440bb29745eed4ad9840875de4f970950065291e7a14cbd249bfbf777d9a997c5e00bbc08e8ce9fdd2cd13c45c3585b4939599ff84c6149ff290c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4"}`, result: func(c *Client) interface{} { return &block.Block{} }, check: func(t *testing.T, c *Client, result interface{}) { res, ok := result.(*block.Block) require.True(t, ok) assert.Equal(t, uint32(0), res.Version) - assert.Equal(t, "81b74dcfc3a42ef331eec2486231aba300ec9a95b024b0151214c76305d409bb", res.Hash().StringLE()) - assert.Equal(t, "a39a1769af16a1aa6715179884d503a1266461cf7100a1c73cb1180956cf255b", res.PrevHash.StringLE()) - assert.Equal(t, "e74f202d6a9a8dd6ed52f7a8e1bbde8b0f86f801cad5692d391643de9a355cc0", res.MerkleRoot.StringLE()) + assert.Equal(t, "75ab743487ce969792a4cb3c235d9ea5ff97af42b2646183c981437a077fbc45", res.Hash().StringLE()) + assert.Equal(t, "6432511ffdb7da7766fac3591efba688793b5368789bdb374de26eaa136bf039", res.PrevHash.StringLE()) + assert.Equal(t, "cd9211a3b642d13d1309817b8a575e4ce00e53947912b34aa0ff61f024faf405", res.MerkleRoot.StringLE()) assert.Equal(t, 1, len(res.Transactions)) - assert.Equal(t, "69d95138263dc54c07826ef1d76f9eb32ff6bf7fc3fc3281194b46ec7683ceb3", res.Transactions[0].Hash().StringLE()) + assert.Equal(t, "115975f7d1e9c4577ec839c6ea4ae32727616284e2d7cdc5a49e4e421b32e505", res.Transactions[0].Hash().StringLE()) }, }, { name: "byIndex_verbose_positive", invoke: func(c *Client) (i interface{}, err error) { - return c.GetBlockByIndexVerbose(5) + return c.GetBlockByIndexVerbose(202) }, - serverResponse: `{"id":1,"jsonrpc":"2.0","result":{"hash":"0x81b74dcfc3a42ef331eec2486231aba300ec9a95b024b0151214c76305d409bb","size":977,"version":0,"nextblockhash":"0xd08e408909ae24de3470a3f231f966e15719910cb7b1a30f356b3e784c1ddf6a","previousblockhash":"0xa39a1769af16a1aa6715179884d503a1266461cf7100a1c73cb1180956cf255b","merkleroot":"0xe74f202d6a9a8dd6ed52f7a8e1bbde8b0f86f801cad5692d391643de9a355cc0","time":1587727442,"index":5,"consensus_data":{"primary":0,"nonce":"0000000000000457"},"nextconsensus":"Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy","confirmations":203,"script":{"invocation":"0c407f70912fdcd0ce9a70963110eb39ef73ed02512ea63bc1c55577474df8f364a874999b16666888f8a3ca69873054a31ab42dd1fee1ed8605ff65edb39797e34e0c40d59459cb1cc8270d9a813aa444852a5d7714aed0b25373ec07549349c6db32b6c8c2e43cdd7b1ad2a4154cb5ff1222d9d7010877016a59775abdd2c08f253c850c4048b65cb58e0d58f2dd0f5db3b195c5784933d6179d8317217ba46f9deac9a667bffb1afd0dd86bdae6267af4c2605f7401849a0b980fcecfeae95df7f5ca6e140c406d9b1942c5aa80070ad484b3dd76421a3f46327670bea94e3ecb3a94eef8843a75195b55872a7c503acb01ab368cdaa11a9e5fb80d55bbd6b861233ba84edcf8","verification":"130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb"},"tx":[{"sys_fee":"0","net_fee":"0","txid":"0x69d95138263dc54c07826ef1d76f9eb32ff6bf7fc3fc3281194b46ec7683ceb3","size":450,"type":"ContractTransaction","version":0,"nonce":1237,"sender":"Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy","valid_until_block":5,"attributes":[],"vin":[],"vout":[],"scripts":[{"invocation":"0c40ae62dadb95b21628921adb9ee14e8c1f20d68b9d6ffba218f8e403af70126449435a53525cd6f1d1c871e64a91025866cd8a413ec70e3cde0ddf62931aa22baa0c40c3e09fc8ad46789d645240634ef40bd180e0dba75beae07a37dc2e899b68b4b3b3a67d076ea9444ed143dbb3264702914a4662ff95859d32c9b5bb5bdc9ec1d60c40b2511115482bd860d85f57103fb8cce2cb45ba8461d4e164685b426cb5df1525e6f09dd7aa23db0fec2241bde7c925e22f3cba3824ea461455515dc2a1455f5e0c40c0aee2528e7fd75a0434f4d67da58507e8d349ca29e01e7eafa9f283e8b8c05d06587db7234f111730c14c8a4bfb7a1ffd9493b9696c71e68966c6bf4a832ab7","verification":"130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb"}]}]}}`, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":{"hash":"0x75ab743487ce969792a4cb3c235d9ea5ff97af42b2646183c981437a077fbc45","size":765,"version":0,"nextblockhash":"0xec27fed4ff8ad6a87bdd29aecee43e9ecb4e336321dac875d0b14d2aab1c5798","previousblockhash":"0x6432511ffdb7da7766fac3591efba688793b5368789bdb374de26eaa136bf039","merkleroot":"0xcd9211a3b642d13d1309817b8a575e4ce00e53947912b34aa0ff61f024faf405","time":1588259741,"index":202,"consensus_data":{"primary":0,"nonce":"0000000000000457"},"nextconsensus":"Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy","confirmations":6,"script":{"invocation":"0c404617b6788538326383015c44ffddd4a05a4e200b65a26fc84234ae8b1e28ef27b7f139dc498c58071193d530ba83081701290eba8f7108397499f5556c16e3780c402131f2bdcc494c73a379e86c46f9e9fe9899a05b23928926b1eaaf816928e160fe971b82263aa1e7efa5f7e46bf99de735fc4fc5aeb81edfdc6a9b2e9fcfa1000c408cbae1582bb9d82de9ff030b8c729737f2157844c0ca29edcdbfed1dd5e2473e0061f0dc29412477417e2c1f7c55443f11b9bd6e0d0856d1ec00240be1b9b9a70c4034d1055531cf0522ac7e5dcd817cf3cd86997ae38da806dc789b1f16eb0005f00b9bc29f7372bb43a8fed040c6763b162c8a0d8e2d0b2d7476e22e0b2b776010","verification":"130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb"},"tx":[{"sys_fee":"0","net_fee":"0","txid":"0x115975f7d1e9c4577ec839c6ea4ae32727616284e2d7cdc5a49e4e421b32e505","size":238,"type":"ContractTransaction","version":0,"nonce":3,"sender":"ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR","valid_until_block":1200,"attributes":[],"cosigners":[],"vin":[{"txid":"0x1f08a32642a43e3f06b3b9a9355ed274c52de85a886841a2aef7edd94d1dc3f6","vout":0}],"vout":[{"address":"ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR","asset":"0x7dc12f8835b085d468ddbab3f7152c0e2f5679b5815b2028685abb4608e7b7dc","n":0,"value":"99999000"}],"scripts":[{"invocation":"0c40bfce1ead7d53339440bb29745eed4ad9840875de4f970950065291e7a14cbd249bfbf777d9a997c5e00bbc08e8ce9fdd2cd13c45c3585b4939599ff84c6149ff","verification":"0c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4"}]}]}}`, result: func(c *Client) interface{} { - hash, err := util.Uint256DecodeStringLE("81b74dcfc3a42ef331eec2486231aba300ec9a95b024b0151214c76305d409bb") + hash, err := util.Uint256DecodeStringLE("75ab743487ce969792a4cb3c235d9ea5ff97af42b2646183c981437a077fbc45") if err != nil { panic(err) } - nextBlockHash, err := util.Uint256DecodeStringLE("d08e408909ae24de3470a3f231f966e15719910cb7b1a30f356b3e784c1ddf6a") + nextBlockHash, err := util.Uint256DecodeStringLE("ec27fed4ff8ad6a87bdd29aecee43e9ecb4e336321dac875d0b14d2aab1c5798") if err != nil { panic(err) } - prevBlockHash, err := util.Uint256DecodeStringLE("a39a1769af16a1aa6715179884d503a1266461cf7100a1c73cb1180956cf255b") + prevBlockHash, err := util.Uint256DecodeStringLE("6432511ffdb7da7766fac3591efba688793b5368789bdb374de26eaa136bf039") if err != nil { panic(err) } - merkleRoot, err := util.Uint256DecodeStringLE("e74f202d6a9a8dd6ed52f7a8e1bbde8b0f86f801cad5692d391643de9a355cc0") + merkleRoot, err := util.Uint256DecodeStringLE("cd9211a3b642d13d1309817b8a575e4ce00e53947912b34aa0ff61f024faf405") if err != nil { panic(err) } - invScript, err := hex.DecodeString("0c407f70912fdcd0ce9a70963110eb39ef73ed02512ea63bc1c55577474df8f364a874999b16666888f8a3ca69873054a31ab42dd1fee1ed8605ff65edb39797e34e0c40d59459cb1cc8270d9a813aa444852a5d7714aed0b25373ec07549349c6db32b6c8c2e43cdd7b1ad2a4154cb5ff1222d9d7010877016a59775abdd2c08f253c850c4048b65cb58e0d58f2dd0f5db3b195c5784933d6179d8317217ba46f9deac9a667bffb1afd0dd86bdae6267af4c2605f7401849a0b980fcecfeae95df7f5ca6e140c406d9b1942c5aa80070ad484b3dd76421a3f46327670bea94e3ecb3a94eef8843a75195b55872a7c503acb01ab368cdaa11a9e5fb80d55bbd6b861233ba84edcf8") + invScript, err := hex.DecodeString("0c404617b6788538326383015c44ffddd4a05a4e200b65a26fc84234ae8b1e28ef27b7f139dc498c58071193d530ba83081701290eba8f7108397499f5556c16e3780c402131f2bdcc494c73a379e86c46f9e9fe9899a05b23928926b1eaaf816928e160fe971b82263aa1e7efa5f7e46bf99de735fc4fc5aeb81edfdc6a9b2e9fcfa1000c408cbae1582bb9d82de9ff030b8c729737f2157844c0ca29edcdbfed1dd5e2473e0061f0dc29412477417e2c1f7c55443f11b9bd6e0d0856d1ec00240be1b9b9a70c4034d1055531cf0522ac7e5dcd817cf3cd86997ae38da806dc789b1f16eb0005f00b9bc29f7372bb43a8fed040c6763b162c8a0d8e2d0b2d7476e22e0b2b776010") if err != nil { panic(err) } @@ -180,21 +180,29 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ if err != nil { panic(err) } - sender, err := address.StringToUint160("Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy") + sender, err := address.StringToUint160("ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR") if err != nil { panic(err) } - txInvScript, err := hex.DecodeString("0c40ae62dadb95b21628921adb9ee14e8c1f20d68b9d6ffba218f8e403af70126449435a53525cd6f1d1c871e64a91025866cd8a413ec70e3cde0ddf62931aa22baa0c40c3e09fc8ad46789d645240634ef40bd180e0dba75beae07a37dc2e899b68b4b3b3a67d076ea9444ed143dbb3264702914a4662ff95859d32c9b5bb5bdc9ec1d60c40b2511115482bd860d85f57103fb8cce2cb45ba8461d4e164685b426cb5df1525e6f09dd7aa23db0fec2241bde7c925e22f3cba3824ea461455515dc2a1455f5e0c40c0aee2528e7fd75a0434f4d67da58507e8d349ca29e01e7eafa9f283e8b8c05d06587db7234f111730c14c8a4bfb7a1ffd9493b9696c71e68966c6bf4a832ab7") + txInvScript, err := hex.DecodeString("0c40bfce1ead7d53339440bb29745eed4ad9840875de4f970950065291e7a14cbd249bfbf777d9a997c5e00bbc08e8ce9fdd2cd13c45c3585b4939599ff84c6149ff") if err != nil { panic(err) } - txVerifScript, err := hex.DecodeString("130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb") + txVerifScript, err := hex.DecodeString("0c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4") + if err != nil { + panic(err) + } + vin, err := util.Uint256DecodeStringLE("1f08a32642a43e3f06b3b9a9355ed274c52de85a886841a2aef7edd94d1dc3f6") + if err != nil { + panic(err) + } + outAddress, err := address.StringToUint160("ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR") if err != nil { panic(err) } tx := transaction.NewContractTX() - tx.Nonce = 1237 - tx.ValidUntilBlock = 5 + tx.Nonce = 3 + tx.ValidUntilBlock = 1200 tx.Sender = sender tx.Scripts = []transaction.Witness{ { @@ -202,19 +210,34 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ VerificationScript: txVerifScript, }, } + tx.Inputs = []transaction.Input{ + { + PrevHash: vin, + PrevIndex: 0, + }, + } + tx.Outputs = []transaction.Output{ + { + AssetID: core.GoverningTokenID(), + Amount: util.Fixed8FromInt64(99999000), + ScriptHash: outAddress, + Position: 0, + }, + } + // Update hashes for correct result comparison. _ = tx.Hash() return &result.Block{ Hash: hash, - Size: 977, + Size: 765, Version: 0, NextBlockHash: &nextBlockHash, PreviousBlockHash: prevBlockHash, MerkleRoot: merkleRoot, - Time: 1587727442, - Index: 5, + Time: 1588259741, + Index: 202, NextConsensus: "Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy", - Confirmations: 203, + Confirmations: 6, ConsensusData: result.ConsensusData{ PrimaryIndex: 0, Nonce: "0000000000000457", @@ -236,53 +259,53 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ { name: "byHash_positive", invoke: func(c *Client) (interface{}, error) { - hash, err := util.Uint256DecodeStringLE("e9f71b58764157f1e2c3e29f217e654b57956ee7c8a60496b03ea85e39084b42") + hash, err := util.Uint256DecodeStringLE("45bc7f077a4381c9836164b242af97ffa59e5d233ccba4929796ce873474ab75") if err != nil { panic(err) } return c.GetBlockByHash(hash) }, - serverResponse: `{"id":1,"jsonrpc":"2.0","result":"000000005b25cf560918b13cc7a10071cf616426a103d58498171567aaa116af69179aa3c05c359ade4316392d69d5ca01f8860f8bdebbe1a8f752edd68d9a6a2d204fe752cca25e0000000005000000e903736ceceeceae1806eee0e3ec61e7cce476ce01fd08010c407f70912fdcd0ce9a70963110eb39ef73ed02512ea63bc1c55577474df8f364a874999b16666888f8a3ca69873054a31ab42dd1fee1ed8605ff65edb39797e34e0c40d59459cb1cc8270d9a813aa444852a5d7714aed0b25373ec07549349c6db32b6c8c2e43cdd7b1ad2a4154cb5ff1222d9d7010877016a59775abdd2c08f253c850c4048b65cb58e0d58f2dd0f5db3b195c5784933d6179d8317217ba46f9deac9a667bffb1afd0dd86bdae6267af4c2605f7401849a0b980fcecfeae95df7f5ca6e140c406d9b1942c5aa80070ad484b3dd76421a3f46327670bea94e3ecb3a94eef8843a75195b55872a7c503acb01ab368cdaa11a9e5fb80d55bbd6b861233ba84edcf894130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb020057040000000000008000d5040000e903736ceceeceae1806eee0e3ec61e7cce476ce0500000000000001fd08010c40ae62dadb95b21628921adb9ee14e8c1f20d68b9d6ffba218f8e403af70126449435a53525cd6f1d1c871e64a91025866cd8a413ec70e3cde0ddf62931aa22baa0c40c3e09fc8ad46789d645240634ef40bd180e0dba75beae07a37dc2e899b68b4b3b3a67d076ea9444ed143dbb3264702914a4662ff95859d32c9b5bb5bdc9ec1d60c40b2511115482bd860d85f57103fb8cce2cb45ba8461d4e164685b426cb5df1525e6f09dd7aa23db0fec2241bde7c925e22f3cba3824ea461455515dc2a1455f5e0c40c0aee2528e7fd75a0434f4d67da58507e8d349ca29e01e7eafa9f283e8b8c05d06587db7234f111730c14c8a4bfb7a1ffd9493b9696c71e68966c6bf4a832ab794130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb"}`, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":"0000000039f06b13aa6ee24d37db9b7868533b7988a6fb1e59c3fa6677dab7fd1f51326405f4fa24f061ffa04ab3127994530ee04c5e578a7b8109133dd142b6a31192cd9debaa5e00000000ca000000e903736ceceeceae1806eee0e3ec61e7cce476ce01fd08010c404617b6788538326383015c44ffddd4a05a4e200b65a26fc84234ae8b1e28ef27b7f139dc498c58071193d530ba83081701290eba8f7108397499f5556c16e3780c402131f2bdcc494c73a379e86c46f9e9fe9899a05b23928926b1eaaf816928e160fe971b82263aa1e7efa5f7e46bf99de735fc4fc5aeb81edfdc6a9b2e9fcfa1000c408cbae1582bb9d82de9ff030b8c729737f2157844c0ca29edcdbfed1dd5e2473e0061f0dc29412477417e2c1f7c55443f11b9bd6e0d0856d1ec00240be1b9b9a70c4034d1055531cf0522ac7e5dcd817cf3cd86997ae38da806dc789b1f16eb0005f00b9bc29f7372bb43a8fed040c6763b162c8a0d8e2d0b2d7476e22e0b2b77601094130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb0200570400000000000080000300000075a94799633ed955dd85a8af314a5b435ab51903b0040000000001f6c31d4dd9edf7aea24168885ae82dc574d25e35a9b9b3063f3ea44226a3081f000001dcb7e70846bb5a6828205b81b579562f0e2c15f7b3badd68d485b035882fc17d00184a27db86230075a94799633ed955dd85a8af314a5b435ab5190301420c40bfce1ead7d53339440bb29745eed4ad9840875de4f970950065291e7a14cbd249bfbf777d9a997c5e00bbc08e8ce9fdd2cd13c45c3585b4939599ff84c6149ff290c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4"}`, result: func(c *Client) interface{} { return &block.Block{} }, check: func(t *testing.T, c *Client, result interface{}) { res, ok := result.(*block.Block) require.True(t, ok) assert.Equal(t, uint32(0), res.Version) - assert.Equal(t, "81b74dcfc3a42ef331eec2486231aba300ec9a95b024b0151214c76305d409bb", res.Hash().StringLE()) - assert.Equal(t, "a39a1769af16a1aa6715179884d503a1266461cf7100a1c73cb1180956cf255b", res.PrevHash.StringLE()) - assert.Equal(t, "e74f202d6a9a8dd6ed52f7a8e1bbde8b0f86f801cad5692d391643de9a355cc0", res.MerkleRoot.StringLE()) + assert.Equal(t, "75ab743487ce969792a4cb3c235d9ea5ff97af42b2646183c981437a077fbc45", res.Hash().StringLE()) + assert.Equal(t, "6432511ffdb7da7766fac3591efba688793b5368789bdb374de26eaa136bf039", res.PrevHash.StringLE()) + assert.Equal(t, "cd9211a3b642d13d1309817b8a575e4ce00e53947912b34aa0ff61f024faf405", res.MerkleRoot.StringLE()) assert.Equal(t, 1, len(res.Transactions)) - assert.Equal(t, "69d95138263dc54c07826ef1d76f9eb32ff6bf7fc3fc3281194b46ec7683ceb3", res.Transactions[0].Hash().StringLE()) + assert.Equal(t, "115975f7d1e9c4577ec839c6ea4ae32727616284e2d7cdc5a49e4e421b32e505", res.Transactions[0].Hash().StringLE()) }, }, { name: "byHash_verbose_positive", invoke: func(c *Client) (i interface{}, err error) { - hash, err := util.Uint256DecodeStringLE("bb09d40563c7141215b024b0959aec00a3ab316248c2ee31f32ea4c3cf4db781") + hash, err := util.Uint256DecodeStringLE("45bc7f077a4381c9836164b242af97ffa59e5d233ccba4929796ce873474ab75") if err != nil { panic(err) } return c.GetBlockByHashVerbose(hash) }, - serverResponse: `{"id":1,"jsonrpc":"2.0","result":{"hash":"0x81b74dcfc3a42ef331eec2486231aba300ec9a95b024b0151214c76305d409bb","size":977,"version":0,"nextblockhash":"0xd08e408909ae24de3470a3f231f966e15719910cb7b1a30f356b3e784c1ddf6a","previousblockhash":"0xa39a1769af16a1aa6715179884d503a1266461cf7100a1c73cb1180956cf255b","merkleroot":"0xe74f202d6a9a8dd6ed52f7a8e1bbde8b0f86f801cad5692d391643de9a355cc0","time":1587727442,"index":5,"consensus_data":{"primary":0,"nonce":"0000000000000457"},"nextconsensus":"Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy","confirmations":203,"script":{"invocation":"0c407f70912fdcd0ce9a70963110eb39ef73ed02512ea63bc1c55577474df8f364a874999b16666888f8a3ca69873054a31ab42dd1fee1ed8605ff65edb39797e34e0c40d59459cb1cc8270d9a813aa444852a5d7714aed0b25373ec07549349c6db32b6c8c2e43cdd7b1ad2a4154cb5ff1222d9d7010877016a59775abdd2c08f253c850c4048b65cb58e0d58f2dd0f5db3b195c5784933d6179d8317217ba46f9deac9a667bffb1afd0dd86bdae6267af4c2605f7401849a0b980fcecfeae95df7f5ca6e140c406d9b1942c5aa80070ad484b3dd76421a3f46327670bea94e3ecb3a94eef8843a75195b55872a7c503acb01ab368cdaa11a9e5fb80d55bbd6b861233ba84edcf8","verification":"130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb"},"tx":[{"sys_fee":"0","net_fee":"0","txid":"0x69d95138263dc54c07826ef1d76f9eb32ff6bf7fc3fc3281194b46ec7683ceb3","size":450,"type":"ContractTransaction","version":0,"nonce":1237,"sender":"Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy","valid_until_block":5,"attributes":[],"vin":[],"vout":[],"scripts":[{"invocation":"0c40ae62dadb95b21628921adb9ee14e8c1f20d68b9d6ffba218f8e403af70126449435a53525cd6f1d1c871e64a91025866cd8a413ec70e3cde0ddf62931aa22baa0c40c3e09fc8ad46789d645240634ef40bd180e0dba75beae07a37dc2e899b68b4b3b3a67d076ea9444ed143dbb3264702914a4662ff95859d32c9b5bb5bdc9ec1d60c40b2511115482bd860d85f57103fb8cce2cb45ba8461d4e164685b426cb5df1525e6f09dd7aa23db0fec2241bde7c925e22f3cba3824ea461455515dc2a1455f5e0c40c0aee2528e7fd75a0434f4d67da58507e8d349ca29e01e7eafa9f283e8b8c05d06587db7234f111730c14c8a4bfb7a1ffd9493b9696c71e68966c6bf4a832ab7","verification":"130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb"}]}]}}`, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":{"hash":"0x75ab743487ce969792a4cb3c235d9ea5ff97af42b2646183c981437a077fbc45","size":765,"version":0,"nextblockhash":"0xec27fed4ff8ad6a87bdd29aecee43e9ecb4e336321dac875d0b14d2aab1c5798","previousblockhash":"0x6432511ffdb7da7766fac3591efba688793b5368789bdb374de26eaa136bf039","merkleroot":"0xcd9211a3b642d13d1309817b8a575e4ce00e53947912b34aa0ff61f024faf405","time":1588259741,"index":202,"consensus_data":{"primary":0,"nonce":"0000000000000457"},"nextconsensus":"Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy","confirmations":6,"script":{"invocation":"0c404617b6788538326383015c44ffddd4a05a4e200b65a26fc84234ae8b1e28ef27b7f139dc498c58071193d530ba83081701290eba8f7108397499f5556c16e3780c402131f2bdcc494c73a379e86c46f9e9fe9899a05b23928926b1eaaf816928e160fe971b82263aa1e7efa5f7e46bf99de735fc4fc5aeb81edfdc6a9b2e9fcfa1000c408cbae1582bb9d82de9ff030b8c729737f2157844c0ca29edcdbfed1dd5e2473e0061f0dc29412477417e2c1f7c55443f11b9bd6e0d0856d1ec00240be1b9b9a70c4034d1055531cf0522ac7e5dcd817cf3cd86997ae38da806dc789b1f16eb0005f00b9bc29f7372bb43a8fed040c6763b162c8a0d8e2d0b2d7476e22e0b2b776010","verification":"130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb"},"tx":[{"sys_fee":"0","net_fee":"0","txid":"0x115975f7d1e9c4577ec839c6ea4ae32727616284e2d7cdc5a49e4e421b32e505","size":238,"type":"ContractTransaction","version":0,"nonce":3,"sender":"ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR","valid_until_block":1200,"attributes":[],"cosigners":[],"vin":[{"txid":"0x1f08a32642a43e3f06b3b9a9355ed274c52de85a886841a2aef7edd94d1dc3f6","vout":0}],"vout":[{"address":"ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR","asset":"0x7dc12f8835b085d468ddbab3f7152c0e2f5679b5815b2028685abb4608e7b7dc","n":0,"value":"99999000"}],"scripts":[{"invocation":"0c40bfce1ead7d53339440bb29745eed4ad9840875de4f970950065291e7a14cbd249bfbf777d9a997c5e00bbc08e8ce9fdd2cd13c45c3585b4939599ff84c6149ff","verification":"0c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4"}]}]}}`, result: func(c *Client) interface{} { - hash, err := util.Uint256DecodeStringLE("81b74dcfc3a42ef331eec2486231aba300ec9a95b024b0151214c76305d409bb") + hash, err := util.Uint256DecodeStringLE("75ab743487ce969792a4cb3c235d9ea5ff97af42b2646183c981437a077fbc45") if err != nil { panic(err) } - nextBlockHash, err := util.Uint256DecodeStringLE("d08e408909ae24de3470a3f231f966e15719910cb7b1a30f356b3e784c1ddf6a") + nextBlockHash, err := util.Uint256DecodeStringLE("ec27fed4ff8ad6a87bdd29aecee43e9ecb4e336321dac875d0b14d2aab1c5798") if err != nil { panic(err) } - prevBlockHash, err := util.Uint256DecodeStringLE("a39a1769af16a1aa6715179884d503a1266461cf7100a1c73cb1180956cf255b") + prevBlockHash, err := util.Uint256DecodeStringLE("6432511ffdb7da7766fac3591efba688793b5368789bdb374de26eaa136bf039") if err != nil { panic(err) } - merkleRoot, err := util.Uint256DecodeStringLE("e74f202d6a9a8dd6ed52f7a8e1bbde8b0f86f801cad5692d391643de9a355cc0") + merkleRoot, err := util.Uint256DecodeStringLE("cd9211a3b642d13d1309817b8a575e4ce00e53947912b34aa0ff61f024faf405") if err != nil { panic(err) } - invScript, err := hex.DecodeString("0c407f70912fdcd0ce9a70963110eb39ef73ed02512ea63bc1c55577474df8f364a874999b16666888f8a3ca69873054a31ab42dd1fee1ed8605ff65edb39797e34e0c40d59459cb1cc8270d9a813aa444852a5d7714aed0b25373ec07549349c6db32b6c8c2e43cdd7b1ad2a4154cb5ff1222d9d7010877016a59775abdd2c08f253c850c4048b65cb58e0d58f2dd0f5db3b195c5784933d6179d8317217ba46f9deac9a667bffb1afd0dd86bdae6267af4c2605f7401849a0b980fcecfeae95df7f5ca6e140c406d9b1942c5aa80070ad484b3dd76421a3f46327670bea94e3ecb3a94eef8843a75195b55872a7c503acb01ab368cdaa11a9e5fb80d55bbd6b861233ba84edcf8") + invScript, err := hex.DecodeString("0c404617b6788538326383015c44ffddd4a05a4e200b65a26fc84234ae8b1e28ef27b7f139dc498c58071193d530ba83081701290eba8f7108397499f5556c16e3780c402131f2bdcc494c73a379e86c46f9e9fe9899a05b23928926b1eaaf816928e160fe971b82263aa1e7efa5f7e46bf99de735fc4fc5aeb81edfdc6a9b2e9fcfa1000c408cbae1582bb9d82de9ff030b8c729737f2157844c0ca29edcdbfed1dd5e2473e0061f0dc29412477417e2c1f7c55443f11b9bd6e0d0856d1ec00240be1b9b9a70c4034d1055531cf0522ac7e5dcd817cf3cd86997ae38da806dc789b1f16eb0005f00b9bc29f7372bb43a8fed040c6763b162c8a0d8e2d0b2d7476e22e0b2b776010") if err != nil { panic(err) } @@ -290,21 +313,29 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ if err != nil { panic(err) } - sender, err := address.StringToUint160("Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy") + sender, err := address.StringToUint160("ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR") if err != nil { panic(err) } - txInvScript, err := hex.DecodeString("0c40ae62dadb95b21628921adb9ee14e8c1f20d68b9d6ffba218f8e403af70126449435a53525cd6f1d1c871e64a91025866cd8a413ec70e3cde0ddf62931aa22baa0c40c3e09fc8ad46789d645240634ef40bd180e0dba75beae07a37dc2e899b68b4b3b3a67d076ea9444ed143dbb3264702914a4662ff95859d32c9b5bb5bdc9ec1d60c40b2511115482bd860d85f57103fb8cce2cb45ba8461d4e164685b426cb5df1525e6f09dd7aa23db0fec2241bde7c925e22f3cba3824ea461455515dc2a1455f5e0c40c0aee2528e7fd75a0434f4d67da58507e8d349ca29e01e7eafa9f283e8b8c05d06587db7234f111730c14c8a4bfb7a1ffd9493b9696c71e68966c6bf4a832ab7") + txInvScript, err := hex.DecodeString("0c40bfce1ead7d53339440bb29745eed4ad9840875de4f970950065291e7a14cbd249bfbf777d9a997c5e00bbc08e8ce9fdd2cd13c45c3585b4939599ff84c6149ff") if err != nil { panic(err) } - txVerifScript, err := hex.DecodeString("130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb") + txVerifScript, err := hex.DecodeString("0c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4") + if err != nil { + panic(err) + } + vin, err := util.Uint256DecodeStringLE("1f08a32642a43e3f06b3b9a9355ed274c52de85a886841a2aef7edd94d1dc3f6") + if err != nil { + panic(err) + } + outAddress, err := address.StringToUint160("ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR") if err != nil { panic(err) } tx := transaction.NewContractTX() - tx.Nonce = 1237 - tx.ValidUntilBlock = 5 + tx.Nonce = 3 + tx.ValidUntilBlock = 1200 tx.Sender = sender tx.Scripts = []transaction.Witness{ { @@ -312,19 +343,34 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ VerificationScript: txVerifScript, }, } + tx.Inputs = []transaction.Input{ + { + PrevHash: vin, + PrevIndex: 0, + }, + } + tx.Outputs = []transaction.Output{ + { + AssetID: core.GoverningTokenID(), + Amount: util.Fixed8FromInt64(99999000), + ScriptHash: outAddress, + Position: 0, + }, + } + // Update hashes for correct result comparison. _ = tx.Hash() return &result.Block{ Hash: hash, - Size: 977, + Size: 765, Version: 0, NextBlockHash: &nextBlockHash, PreviousBlockHash: prevBlockHash, MerkleRoot: merkleRoot, - Time: 1587727442, - Index: 5, + Time: 1588259741, + Index: 202, NextConsensus: "Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy", - Confirmations: 203, + Confirmations: 6, ConsensusData: result.ConsensusData{ PrimaryIndex: 0, Nonce: "0000000000000457", @@ -653,19 +699,19 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ { name: "positive", invoke: func(c *Client) (i interface{}, err error) { - hash, err := util.Uint256DecodeStringLE("b3ce8376ec464b198132fcc37fbff62fb39e6fd7f16e82074cc53d263851d969") + hash, err := util.Uint256DecodeStringLE("05e5321b424e9ea4c5cdd7e28462612727e34aeac639c87e57c4e9d1f7755911") if err != nil { panic(err) } return c.GetRawTransaction(hash) }, - serverResponse: `{"id":1,"jsonrpc":"2.0","result":"8000d5040000e903736ceceeceae1806eee0e3ec61e7cce476ce0500000000000001fd08010c40ae62dadb95b21628921adb9ee14e8c1f20d68b9d6ffba218f8e403af70126449435a53525cd6f1d1c871e64a91025866cd8a413ec70e3cde0ddf62931aa22baa0c40c3e09fc8ad46789d645240634ef40bd180e0dba75beae07a37dc2e899b68b4b3b3a67d076ea9444ed143dbb3264702914a4662ff95859d32c9b5bb5bdc9ec1d60c40b2511115482bd860d85f57103fb8cce2cb45ba8461d4e164685b426cb5df1525e6f09dd7aa23db0fec2241bde7c925e22f3cba3824ea461455515dc2a1455f5e0c40c0aee2528e7fd75a0434f4d67da58507e8d349ca29e01e7eafa9f283e8b8c05d06587db7234f111730c14c8a4bfb7a1ffd9493b9696c71e68966c6bf4a832ab794130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb"}`, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":"80000300000075a94799633ed955dd85a8af314a5b435ab51903b0040000000001f6c31d4dd9edf7aea24168885ae82dc574d25e35a9b9b3063f3ea44226a3081f000001dcb7e70846bb5a6828205b81b579562f0e2c15f7b3badd68d485b035882fc17d00184a27db86230075a94799633ed955dd85a8af314a5b435ab5190301420c40bfce1ead7d53339440bb29745eed4ad9840875de4f970950065291e7a14cbd249bfbf777d9a997c5e00bbc08e8ce9fdd2cd13c45c3585b4939599ff84c6149ff290c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4"}`, result: func(c *Client) interface{} { return &transaction.Transaction{} }, check: func(t *testing.T, c *Client, result interface{}) { res, ok := result.(*transaction.Transaction) require.True(t, ok) assert.Equal(t, uint8(0), res.Version) - assert.Equal(t, "b3ce8376ec464b198132fcc37fbff62fb39e6fd7f16e82074cc53d263851d969", res.Hash().StringBE()) + assert.Equal(t, "05e5321b424e9ea4c5cdd7e28462612727e34aeac639c87e57c4e9d1f7755911", res.Hash().StringBE()) assert.Equal(t, transaction.ContractType, res.Type) assert.Equal(t, false, res.Trimmed) }, @@ -673,33 +719,41 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ { name: "verbose_positive", invoke: func(c *Client) (interface{}, error) { - hash, err := util.Uint256DecodeStringLE("b3ce8376ec464b198132fcc37fbff62fb39e6fd7f16e82074cc53d263851d969") + hash, err := util.Uint256DecodeStringLE("05e5321b424e9ea4c5cdd7e28462612727e34aeac639c87e57c4e9d1f7755911") if err != nil { panic(err) } return c.GetRawTransactionVerbose(hash) }, - serverResponse: `{"jsonrpc":"2.0","id":1,"result":{"sys_fee":"0","net_fee":"0","blockhash":"0x81b74dcfc3a42ef331eec2486231aba300ec9a95b024b0151214c76305d409bb","confirmations":205,"blocktime":1587727442,"txid":"0x69d95138263dc54c07826ef1d76f9eb32ff6bf7fc3fc3281194b46ec7683ceb3","size":450,"type":"ContractTransaction","version":0,"nonce":1237,"sender":"Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy","valid_until_block":5,"attributes":[],"vin":[],"vout":[],"scripts":[{"invocation":"0c40ae62dadb95b21628921adb9ee14e8c1f20d68b9d6ffba218f8e403af70126449435a53525cd6f1d1c871e64a91025866cd8a413ec70e3cde0ddf62931aa22baa0c40c3e09fc8ad46789d645240634ef40bd180e0dba75beae07a37dc2e899b68b4b3b3a67d076ea9444ed143dbb3264702914a4662ff95859d32c9b5bb5bdc9ec1d60c40b2511115482bd860d85f57103fb8cce2cb45ba8461d4e164685b426cb5df1525e6f09dd7aa23db0fec2241bde7c925e22f3cba3824ea461455515dc2a1455f5e0c40c0aee2528e7fd75a0434f4d67da58507e8d349ca29e01e7eafa9f283e8b8c05d06587db7234f111730c14c8a4bfb7a1ffd9493b9696c71e68966c6bf4a832ab7","verification":"130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb"}]}}`, + serverResponse: `{"jsonrpc":"2.0","id":1,"result":{"sys_fee":"0","net_fee":"0","blockhash":"0x75ab743487ce969792a4cb3c235d9ea5ff97af42b2646183c981437a077fbc45","confirmations":8,"blocktime":1588259741,"txid":"0x115975f7d1e9c4577ec839c6ea4ae32727616284e2d7cdc5a49e4e421b32e505","size":238,"type":"ContractTransaction","version":0,"nonce":3,"sender":"ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR","valid_until_block":1200,"attributes":[],"cosigners":[],"vin":[{"txid":"0x1f08a32642a43e3f06b3b9a9355ed274c52de85a886841a2aef7edd94d1dc3f6","vout":0}],"vout":[{"address":"ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR","asset":"0x7dc12f8835b085d468ddbab3f7152c0e2f5679b5815b2028685abb4608e7b7dc","n":0,"value":"99999000"}],"scripts":[{"invocation":"0c40bfce1ead7d53339440bb29745eed4ad9840875de4f970950065291e7a14cbd249bfbf777d9a997c5e00bbc08e8ce9fdd2cd13c45c3585b4939599ff84c6149ff","verification":"0c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4"}]}}`, result: func(c *Client) interface{} { - blockHash, err := util.Uint256DecodeStringLE("81b74dcfc3a42ef331eec2486231aba300ec9a95b024b0151214c76305d409bb") + blockHash, err := util.Uint256DecodeStringLE("75ab743487ce969792a4cb3c235d9ea5ff97af42b2646183c981437a077fbc45") if err != nil { panic(err) } - sender, err := address.StringToUint160("Ad1wDxzcRiRSryvJobNV211Tv7UUiziPXy") + sender, err := address.StringToUint160("ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR") if err != nil { panic(err) } - invocation, err := hex.DecodeString("0c40ae62dadb95b21628921adb9ee14e8c1f20d68b9d6ffba218f8e403af70126449435a53525cd6f1d1c871e64a91025866cd8a413ec70e3cde0ddf62931aa22baa0c40c3e09fc8ad46789d645240634ef40bd180e0dba75beae07a37dc2e899b68b4b3b3a67d076ea9444ed143dbb3264702914a4662ff95859d32c9b5bb5bdc9ec1d60c40b2511115482bd860d85f57103fb8cce2cb45ba8461d4e164685b426cb5df1525e6f09dd7aa23db0fec2241bde7c925e22f3cba3824ea461455515dc2a1455f5e0c40c0aee2528e7fd75a0434f4d67da58507e8d349ca29e01e7eafa9f283e8b8c05d06587db7234f111730c14c8a4bfb7a1ffd9493b9696c71e68966c6bf4a832ab7") + invocation, err := hex.DecodeString("0c40bfce1ead7d53339440bb29745eed4ad9840875de4f970950065291e7a14cbd249bfbf777d9a997c5e00bbc08e8ce9fdd2cd13c45c3585b4939599ff84c6149ff") if err != nil { panic(err) } - verification, err := hex.DecodeString("130c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e0c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd620c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699140b683073b3bb") + verification, err := hex.DecodeString("0c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4") + if err != nil { + panic(err) + } + vin, err := util.Uint256DecodeStringLE("1f08a32642a43e3f06b3b9a9355ed274c52de85a886841a2aef7edd94d1dc3f6") + if err != nil { + panic(err) + } + outAddress, err := address.StringToUint160("ASW1VhcukJRrukCXRipY4BE9d9zy4mAYsR") if err != nil { panic(err) } tx := transaction.NewContractTX() - tx.Nonce = 1237 - tx.ValidUntilBlock = 5 + tx.Nonce = 3 + tx.ValidUntilBlock = 1200 tx.Sender = sender tx.Scripts = []transaction.Witness{ { @@ -707,6 +761,21 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ VerificationScript: verification, }, } + tx.Inputs = []transaction.Input{ + { + PrevHash: vin, + PrevIndex: 0, + }, + } + tx.Outputs = []transaction.Output{ + { + AssetID: core.GoverningTokenID(), + Amount: util.Fixed8FromInt64(99999000), + ScriptHash: outAddress, + Position: 0, + }, + } + // Update hashes for correct result comparison. _ = tx.Hash() @@ -716,8 +785,8 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ SysFee: 0, NetFee: 0, Blockhash: blockHash, - Confirmations: 205, - Timestamp: uint64(1587727442), + Confirmations: 8, + Timestamp: uint64(1588259741), }, } }, diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index 2d10b8e5e..6a5ef7135 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -53,12 +53,12 @@ var rpcTestCases = map[string][]rpcTestCase{ "getapplicationlog": { { name: "positive", - params: `["953b6e5ba85dd068c2eba5afd2ffdf8ff832b3a791976e2fd896baf5737b2616"]`, + params: `["9872fd330d63d64beba7122fcc9678e7f380d2163acff6a7d4f67a3c01cd67d1"]`, result: func(e *executor) interface{} { return &result.ApplicationLog{} }, check: func(t *testing.T, e *executor, acc interface{}) { res, ok := acc.(*result.ApplicationLog) require.True(t, ok) - expectedTxHash, err := util.Uint256DecodeStringLE("953b6e5ba85dd068c2eba5afd2ffdf8ff832b3a791976e2fd896baf5737b2616") + expectedTxHash, err := util.Uint256DecodeStringLE("9872fd330d63d64beba7122fcc9678e7f380d2163acff6a7d4f67a3c01cd67d1") require.NoError(t, err) assert.Equal(t, expectedTxHash, res.TxHash) assert.Equal(t, 1, len(res.Executions)) @@ -253,7 +253,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "getassetstate": { { name: "positive", - params: `["b16384a950ed01ed5fc15c03fe7b98228871cb43b1bc22d67029449fc854d104"]`, + params: `["8ef63ccd6f4ea20a93e7f4e84b2d43f778077612b241d617e42e1750cca4f2c5"]`, result: func(e *executor) interface{} { return &result.AssetState{} }, check: func(t *testing.T, e *executor, as interface{}) { res, ok := as.(*result.AssetState) @@ -472,7 +472,7 @@ var rpcTestCases = map[string][]rpcTestCase{ params: `["` + testchain.MultisigAddress() + `"]`, result: func(*executor) interface{} { // hash of the issueTx - h, _ := util.Uint256DecodeStringBE("8a4711012932f4f79f9534803feab0ef85e7a313c52a36f5d56b9f8ec190bd92") + h, _ := util.Uint256DecodeStringBE("99bd2bb2791887ddd3f64dac70ac15339956c76e7c306a1202372ff24fe30635") amount := util.Fixed8FromInt64(1 * 8) // (endHeight - startHeight) * genAmount[0] return &result.ClaimableInfo{ Spents: []result.Claimable{ @@ -531,7 +531,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "gettransactionheight": { { name: "positive", - params: `["5f1e841f625d52dd3d73bbf5203f8468835353b7c476a4d367161ea959944981"]`, + params: `["1f08a32642a43e3f06b3b9a9355ed274c52de85a886841a2aef7edd94d1dc3f6"]`, result: func(e *executor) interface{} { h := 1 return &h @@ -743,7 +743,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "sendrawtransaction": { { name: "positive", - params: `["80000b00000075a94799633ed955dd85a8af314a5b435ab51903b004000000011e4db58df4326140a371d0b0cabecea70226b93157dfb561c73ba8db599ebcb6010001f5bc5a9ac7b85a47be381260a06b5a1e7a667ce8f7d7c8baa5cfc6465571377a0030d3dec386230075a94799633ed955dd85a8af314a5b435ab5190301420c401b3040b6eea83bfbd555554c94e7a0e6077922769f3ac19c1183e14dfd1d6ef6a87658b5499921ac59ae2d2acac10d8f0f6147620e27616bb5b7305fb36b6ce0290c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4"]`, + params: `["80000b00000075a94799633ed955dd85a8af314a5b435ab51903b0040000000001e53e6c239e3d8441f623ea7b48cdea60c6ae0426a8bac04296002babfeafe5a4010001dcb7e70846bb5a6828205b81b579562f0e2c15f7b3badd68d485b035882fc17d0030d3dec386230075a94799633ed955dd85a8af314a5b435ab5190301420c408378eb6bdba1f14540cf2920a4d49c52327f617dc861a21d1c085346aaae2abd410e28dc6a03471a78e71246696a591b9677a71144dfba557d1c781c8c97e350290c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b680a906ad4"]`, result: func(e *executor) interface{} { v := true return &v @@ -890,7 +890,7 @@ func TestRPC(t *testing.T) { var res string err := json.Unmarshal(result, &res) require.NoErrorf(t, err, "could not parse response: %s", result) - assert.Equal(t, "400000000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b0000000000455b7b226c616e67223a227a682d434e222c226e616d65223a22e5b08fe89a81e882a1227d2c7b226c616e67223a22656e222c226e616d65223a22416e745368617265227d5d0000c16ff28623000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b00000000", res) + assert.Equal(t, "400000000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b0000000000455b7b226c616e67223a227a682d434e222c226e616d65223a22e5b08fe89a81e882a1227d2c7b226c616e67223a22656e222c226e616d65223a22416e745368617265227d5d0000c16ff28623000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b0000000000", res) }) t.Run("getrawtransaction 2 arguments", func(t *testing.T) { @@ -902,7 +902,7 @@ func TestRPC(t *testing.T) { var res string err := json.Unmarshal(result, &res) require.NoErrorf(t, err, "could not parse response: %s", result) - assert.Equal(t, "400000000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b0000000000455b7b226c616e67223a227a682d434e222c226e616d65223a22e5b08fe89a81e882a1227d2c7b226c616e67223a22656e222c226e616d65223a22416e745368617265227d5d0000c16ff28623000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b00000000", res) + assert.Equal(t, "400000000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b0000000000455b7b226c616e67223a227a682d434e222c226e616d65223a22e5b08fe89a81e882a1227d2c7b226c616e67223a22656e222c226e616d65223a22416e745368617265227d5d0000c16ff28623000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b0000000000", res) }) t.Run("getrawtransaction 2 arguments, verbose", func(t *testing.T) { @@ -991,7 +991,7 @@ func TestRPC(t *testing.T) { err := json.Unmarshal(res, &txOut) require.NoErrorf(t, err, "could not parse response: %s", res) assert.Equal(t, 0, txOut.N) - assert.Equal(t, "0xf5bc5a9ac7b85a47be381260a06b5a1e7a667ce8f7d7c8baa5cfc6465571377a", txOut.Asset) + assert.Equal(t, "0xdcb7e70846bb5a6828205b81b579562f0e2c15f7b3badd68d485b035882fc17d", txOut.Asset) assert.Equal(t, util.Fixed8FromInt64(100000000), txOut.Value) assert.Equal(t, testchain.MultisigAddress(), txOut.Address) }) diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index d069cd910e4d79a69f2e213930a3727bf8e02fb3..91f52796f2ed3e9ee97fd2672310ca5455adf405 100644 GIT binary patch literal 113865 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

XE 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 DmT*4N literal 113856 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≀7 zV9P-#5(HP@^uw9+zkM?G?Nk2%R3{giyJ=LbK7mM(|F~Ow5A6=^c5*we5G67n7>v$3 zz74u@XqJEKT;Yo`l55vwhKJS#I#Dm58XnfiG%D0W(KI3A>HJgE?U7mEt*xdMai@2& zEBmS9v&W$X$y0l0EK7>;PDorJvduO9RNf2=XUTAhv|!SAw|AzEzJ2td=Bd0g{>bqb ziRu>;%CC~xV`|I8#Kd*>?DOvDyJuS?-U<#mX-zXI4Ty&X|4b2e>@%A3IBc17DNSMC z>W;+Xwk_$TXzAL*-B~6&l2q&p>KtE#a#>PoR(D*xxd=&;(eBeqxi@hG8%6c;j^2o+ z`%-!GEyS^)NK#XhLRR`vPs&dE={w=#7GTV&l^jX^H)!0kgeWngV3qiDYlN4c)geLKvRoZpwS?Bp zoal2Kh_UnQX_z#_?Ss0uzo@ET|5w~Z@DovTTvd<3;Lm*JP7qC0+Wf`QgMneMLR{&> zf9eOxbZkSKrwVhE>H~LY-^{lX#tH%mwwpdK(gJ|`3oLBCXw=)CqAXB)Mhb1-jQaXp zLz0=FqOa?|{nqaxx64Cj3GtM;cveDar4)#s{#~X2WCo+prGHrsaFqoeasO3F{B2yP zG*Y`NQxK6@RQ|meYkI^gV0U$m1aYfZJ1qU%xA}tmnai>FqAPf8O(Z0OxqT3ghD#6^ zqlFZGZs?tm_{JfG^#jH8CkIek=vefw$g%R|nE|L=kOso{i~Lt#X5rJ!*ohB(io%ifJV#Pr0{2~rQO`ylK*J&4?oa=spsAN!Chh(sYcw>N`;pIy6-CaV-!s!hqN)-43aOXYImo@OE>g zDr-(8&kVXG79*{;H*<(yripXdHhJ9&wB>W6ieI_&-ysEGi%=>Q%|53)yb zJ)Mi4)CAXnc&uXM9qgk2{`fkVk6CwoBzk74$(0wHI=+aY!!hZ;R*+tH=a_<*D(Px~ zi+m>}q9PIJt@$RmhLx;6L;8Q{?IDbM87m#F6MyR+=YiKPdW%He3kkJXNoXS#P~d7y=oEjAGVK&VZtO~o1x@xzp`9|~F`R_;h%3A2_g%LXS`cn$Yy zdDKBw?lv$+EWfa8fz@Ipf4RTBNPX=8jrt`Tvt*vK~nwfU?U zePT6|zoT^L>YXBCq*u>H5t;v}S3}o|=}u7HOcGBsnd=`lfXAJxLV+oUUg4 zvMo7eCzNPQ=OgY4A(&J^Sn}1D)GTcsm&1ixnuxwk!>Z-6q({S>3&7@OgU@EYm10>~ zShu9)0oL~sl)a3~{bdpQz~g1*w@>rEib_Ad_n>f{Th@&f|Gy&l%Y@VWd2?i&(C8fp z=R}iZIKBux#M4vF+e3S`v!}*ral0x2@H*!XfGX@R6<(|4b+NII7zh4u zJheY{S>5ZjFc2oLjfEMZg7UZ;AhG(sddWEY3W`2VqAP0bzL!3Z#%!@F;@yORM+~HY zPDTt{CQ+Q+L;r#2Kz7mj@9hS^Ilip%g@op-Bo^6G{M%(eCh1UrO5O5b;5U@el0_E3 znya##S}Yavq7$2y!#=fGrh#sVjRio|@}Yri-2hG?6GRT=nGHy^qyRunUvbZk)`Odk z4?`5r@k_%b<+nL%yS2(IBo9mvz8^n7`2<3W_t0caIDL>z)W3?SAxdVQb|GFS+kiGa z@g-^m0I`a(&xSty4YDr2XGcU^3;7W+0m+w~>cE)Kfwc-_Z8_HdG?v7 z((ZqZF*4d2OM7AxR897~|2wh3iv|C8_qW-Mewcsqy;Nvxm)Q8o$x4?!1V5R3E(f@? zmKa9{oyF4=LrvMh!Q3S{PbCYNl`OYcOW7{0N$FCzy(^z1yT|H|``{qC9=jllz?j z!2d>g%_ZHl`!hc{bZ>%&iRtuJK`*HwYgkZ!%32XT-YC~|Zk37YGTm8hNu@IPL&EzP zU@aQ@{ZA-UOp^mxjSK+ju-xd(w}b?%F~_-*M!00`g<1b!IJ&Wj$%(F2shH9hc4kpeVlQH8O-8eos$gIK6kT2x1Ot6@?=hGghpb;J1u&%JF)NAlI6)v;|+ z2O(9{>ZUTy>%|?FM9D|z#xx4hyndg`j02I@5^ugRY-`@Rn}GNEC-Hh>Ceqej*IHtH zIGI5tfLr-_00Sc7@OSyqG*C$s)j~$(SgrF@JTNB1IHlZBo{!R%Ky-$bkaT7RUdYf` zRYaflynMd`MDz!smD@-s=^wH92p z;m=aGdUIA)%L@seS4r3i=fj8lXK@VOVR* zV&*Z>(_6pWDK6^z&&VZaau1?ahHAu7Kepj>x+DAxe|+!oX5>sLC$bA+!#ol9FA&4m z@=s#wW2tupfA$MBMmPb0y>~(aNfJeZesBwNIP+F$ac)}I?YG~|oK;E#9uZ%E^S8LT zx1vPr3kls7x!6e0t6@h#?qT!B;@XknaeFKv++9w|F$5J4VU zb~trY{+hdgt0@=(dXhP_gs~hoWo2~xn!nDsvcL^}{z2h?H~uMu;8B047D~;_oge@} z1kk8WXPsRk!5Pc;pPsRsowEYzn#X#YW2`+-2>X+{(nwbve-e_pylbA!SIn>N)P%)0 zM6Wkx+#uVMUIC^_|2m92mSZ)WlnPqEE2AuYg=5uXdm8{0u4F85+LC6AEUPNpSWY&8`>k!x z1Myu=pT6f**VLrEvbX_t-{h5fa^lVrVP>{R@8s|NSf4YC@5s-iLHmepY|G;M z?U&dEv^UF-wa~=A9XdZ_`}(XRwFhLSB3h=oWqp%_mAa%DdYX`x`}N(@9A&GYh~Cv4 zj|k$DURmj#LAv(f&e0|5Xxw z{!WK7)K%PzC^At@drmDR630tD80)AXetX*MU~x`e$4c)nDn;#VYzKBf^P-9<0$Cbq zDQ!u2hbpHbG9+n0Pfm!*lxq%ODLLcmoRUp<1qH|m&li3-HUGNv_-vOzAJPelOzL}N z`XqthKSJGEp}b77YlZsrV1Z+rIF9t343z)ehag>w2AoZ;Kj0f*-~Anq(J7$dBGpK7 zM*ct^KrM^)G4{v--3m{^x02I>pMs}09ANX0J=|BoO7#)n{}wn#prI3&BC4ZpJ4I+v)_Ux|Q4TT$CXp z=ZSYhV!I(+;(}J={O?NGv9$Kiv(P90N0Gagh8U|kR`G_PZ?2*5cp+i%DhY2UY~01D zzU9Z`mS1!NB#M&U$s5ATCmPnne$s(^eW&|n+av2K#k-WU(2!A7w-^4NK|?dkB+C!xOL&D z1}kF{GvZxXu+76x;tojH6*o8Tq?Q(vhMlF_Uq8CwoKger32l(+mqkN1;XTpy$_)Ey zf>>d)8mG-gsnefzYHSU&QSajGO-Io3?Wcd_pherq4k$7DTbLeGY3T7da0WD3&UZpW zk<1}tJqnn$bGq`CMEJ2jH9?Qyraf_IHV4f^H%+tattip?Lc;J>5}0_)?uz32R@!N5 z8@kt7CB3jdBVS5ODLjYDKWe&jbSHi(O6b&}wj%k*VqgF`RkP(GuVUWcXkM7ut1NaE6PMvvbTzMl&$;}hJ0u?$m~q5bXIEIk*`|65Jq{qq|QtFogdJZ zG02POxnBTmQ9xYs_tLb=`gCacBw@0IbpYEyYa>=&J`T;dNOZlBFnX1Qxhc4GsCWqefGcx_HWOrUV;rVgAtXW!U(wq@oUh@)Cjk zD|d>LAJb%QA%s-RB+s1^yYsL`2xw~+KQGy7QuPqyQWOF+DldF*6+wp-3NC*bjkMqj6*# zErRKA|7W-Y9871a+`;afuL^_%^>0^>+)-F}y`11%sF);=ILtWy!dlQ-Vi#)9%xk30 zh&i740{7C0ezP$Zk5cl}Z*$nJ)U&8uo6nO{W@|QjQ`6CP&Qf|LxRJj;oYp{cDhNS} zol>hs@qo5z%#Z%TRS?!dLj7*jyb;$H8^KGTd$gjyKD%eP3gJh zyQB`|`73S7@P;Ntr8B}kz$Ge2ZXc$9(yzhF?PApedxUpFLV_qef6QwSPnL#0$fX0G z@7GT@@yl?@Ta#N67*tf}mA6RrypZ_(Dv8Ze%!`3S!)7TRZNPa$7;ZV*;g8}=t3-53 zbXZ}EMde`o|2v1nD2& zZ=kupL(*AQd*o*i;Ht_OW4Te0dMOp@-IsPpO1~2l+-X*iyK=bQtPkKW+lAx&6R#T4pRf4~-}}qnGLzk{*iNmtiVcwAny70}OVb7l`?jB& zh=IcNNskT0du2HKgq@Nz`(y-4bZLhr&Hxg^6gCo(Z+Xq|X=dJG$Y0mpKSWZbphFy~ zMBTN_u$N#rJc2d{NsenTWj0*2V=RpQN<_ZBVYesBmGYh;iRlY5oAfj%OX@*6%eF(n z`S~CWekz-2wwOVeCvb!5i~$x4&!ZjsPDtoLuc1DFjbOb@XUK!xO{*D`+sdYx`@2?^ zOjwQ-h0OF8iC-@yOkX9jZEUUcuTn;V16(J?RP;v?4#tc@D+Y^=`#|>ql6kyg2zjG` zyl8qQs?zjP*RWsikGhqeWteaaoOz{o5h|Y?&?o?9$s5oRhja2^oCrs#2$>m*e0)f~ zA_1@(El2m-8nd8LcJ69zc;`oeZ-bQa8O9)XBqsDWRUwXGxoz_-hPT z$H}W%JPFOWXD;P~JY{x44#M585N=nV1(;X6oaiu10T-pKtNkF|9>0p!wtoTq#IJZF zV~hMx0AT(qC$UDQy^B`fxwTIhA6_uQUxUat<5KRkCdMxaU7yEIr~;;rmHlYR$VV?X zssPS=olV4&qer(5bsKy|f&%Y^L_-}owEt}Yd-w^J(+}9=@MmwsRrw!;D6v==oIXG7 z-^^b2y^t__m4w}V`gFoqf4dX}tR!&?$BZSGS>Cg3&z`Qvp>QM3>NtGcaeDy3IYHH)$??smd#VMOHJD3foVYTR0-lXSskORv zi6*O1H+gS((D8M z1qa{|_MmyZa75^qJ1=Jx+9RyET>{-CM`q#ILH282xUUA1Y97fJ-RZo&-rR=?%7HOr zII{T;;X6KFKz7#m5+!z{Ejmpgs%!3fl5&-QmVW)$T$M4*>l^s9>s0Xg!|m!@QKJ8a zg!$_v#MAYehpLI2xthBAnrFvvCWG#BJ()Nq69A9=XI4rYm!YBUhpFH+t#*Az8pAv- z{c@@hdx8w=_v`hKJS{o^;DCTMPwjJ4Cfxj(%V9X4d@OY>TL>fk*^S~HqfkYAEt^V# zhi%)#V~P*v{+D?V0esz2#=TN#oGi+46-Ode(D4#$-pKqiiTViP=`R_-{Uzp9HH>+e z?(TufRSMbSl`&A2IFVtUP-!k5a(QLJrI<7n#n+YKsjn&OE>+SfmqrW@J3MPlHEgvF~Q$^*X{ z$Ry~O9B27kW{sD0PSAw}D9#r45G(SejL*o8>fopn3f(6-ZOMMgiy8WskPs(Dv8?5$ zuA^fRBSMZc59<3~*SO3NYaLO5ee~H#T$z#%-Y0c&N4)IyKUO+21!EHPmAFkf#1HqR z0>@APr~m0E)D73lRb0lM-EC`E-Wo3%9`D;YT;~ zPDsGXxkLf5rYdHtz{?1FrM4PB|L9q@Cg&2zJLL=EIDIpF`TK>0<*Ou`F!OwZ16Ren zF0qdWlua?o(du}S;xzt>;~tTzR-P`+HROL7RM>DXe&+FSRw9E-*e*nmAXz}%&B>)1 z%1Z*(SML`nE9EUkXFyYaK12TD&O4{#+7?$`hK^y`PoajRKEhw%DA&UqM&AH_O(l6} z{e@K|pIaXp1Hvbm88NW!3+To%-g`RExD0{5ZCX-YeXpYSskwuw+ml+PxQyH95-5pe~ zugmj=OcKTyg7cO8(T=RRCfff-acenBTf)lf&F`c4+8hY{c(NMu^Tg}@Wj?$U5<%k# zOsXaA_zH#NPN{l1!m?(4j(y;Bzn+C13|scG-n@hkzL2nbl>{qwW5^e>RC29Lug8I! znFEv@1;yxgYLzmwqdB{d?7_XUztY=o&Iu|t4tA`qB5R@+u(nAoU-U_#is{+t8p%Ox zTLpbr_e{f4Z*DC*=vn0G$>rF#tF^~`oa~#yDM~+ad(bAw1t1B4uI+c|XPf%Amg$vnL> z5%oZ~X=p?VS=Eo;GJ^xk9GWfUS9C;5dK}jP;K4kbME=>;Z)Z}AY%D`mIra0ob9ot& zap?V$0>QOuR<2Ar`U~yYbvG_rv)l~SIm?Dtz(bEzxCl5dLd!`Dhd9k?ZVj)*aOuyiT<+soUJ`+ zR^!v%?l3{SzKazd+##dIfqEA~mbJthOgAlO6*~~5xZwnh1G}hayDmmHc`Tr=?Zef+ z(sp=AEsISYGU%jgqyJj0x2F{{ZT?iK1J=#ZU}mxAQS}#B4{;plM2_8cPVKCZR_7Qi zjklOTlIe4Sp4XKd=e3xoN&?rMWbpP{wy>L0g)xP<32`IAtD3S1ePwm{tI$et>e@u1 z&HEfzZA)@d`ekC=oov^S7C(u*7e|6_Ju%v}`_gF2u~I8S_-9|M{v7h1-OR_(KNXq^ zLapNeY#@G0S{c+eIyobDh$idO>YUa?5MsJ^IY2qbCq{z!`A(ul^(7W30;2)&iL(>6 z+uuNcJhhMNYtT6Taa%$t*zoY1ZydufBy3(KalQ*77R9LQj)4M`xypm{(BNd7j=QQX zuZk0kN>tRBU$!;4mCTC~sXWMhCd46Cwbm{Nfu+reAIr~gc5stn3;?pGM^|JA8SKaEd% z1c4J&6LtGgeVDP=N_wgh*20I>ybtCvRR8EcLd&Xq|tZAU{>PkKhUPm6Y6Bp@lrF$5jzl7JTQ*pJhEP9 z#c)3xs-R2-&VQUTW0F+@Qqd1wliPf8h#`%qU!atgbAIrFXAKD^vMsQ`p9E!7SQfMk zSSll|zT*!n!Y_~isk_UrD!VNVz#t&CX^@nB2}ud**mOxZ(hbrb(%s$N-5}lF-6;*y z4H9RcG58Fh`488a&wAFH^Pb2_hQd)k>ZRqDte93Q2_^05hV8qTBYLFr{4>}~B>}U( zOo~zq`F<0wpuNAg5$O8fvFcKE(X_{>K zqL^uT+)D^#j$@|KPpcL2tBtT2L|~1y7Ask zNx)|2=PsWVHLjDS^jxq-G+JA^UzutWM6JQ=iiLxQe5G2m{xfG3ip32g9>(q)L&Iuk z>7S82$zKri<_T$`eVTd5@~kz4!-16GLe;brC|4&J|EQ?s?2pW&dQVz*2kMt_3Y$}> zULT$3X&kOM^KiT$wGV9?Qx!blIx-|IYx{dMirc-UA_83zTP>||wtOCULB(Nz8nXS_ zDKkEhsj2{URi$5{X+Cb~d?vb#*+Z#k%+=R?h8PS1#SrI$m9J^k1lj_D7tds~4~EP0 z6rk@%S-Pt{%+DS|n7q>Y$(e-Wy=(w1%ueaaA{Qe_bhkHWC*Y>N;Sw+RH~!~>hnI3d zi{wZD7K!l}5|*!$_=Mrp5+EsqAah9vpz5HEuY1Vg%ye5JE?rYu$3D}*%=q=U8eUQ% zAhBC?KL01WRIgN72m2H*GaEsdFxO)Xs8>PCT44myo~qz!xC67XHLgU1! z`DvfH!6_x9{dM{uT=n;mcTy!bolt)Pp+n?&ErK7xO#l9OaVQ`MF?(TUIEzQ3hbidz z7Kw=$5>~I0sK_VxN1+$9STCTe;;!t&CnW5!xf||@3^^oOD~4irJ8$y8U|v}JS#2Pj z<~p-CSn^Q@Uq)v&12azCvj}e~7IY_opKPrNpQOC?rycO!JCAb1s&~$g5As%{*x$>i zla3&4HzfrAYRK1a=R(%sbw^=eld>t(01P~^?=Ua@7sM?9_$;Y@>a~q^3tbmWa^@{M z%2J{IGvhRJ#8d1r_wtuq7*qs}i@^d6k(-O;w%df(V%jPW-lP@H! zUnL<}Ci%AuSO*8ePbt^vyts72|AkiCBT`kh?RkQypZrw5Q{0@%xJQ-`Jn%7u80?Rn z8Ys0CK_;4>U&jJNG^ZH=O#Jm^8Ww5V<5S1N7Z7%Grm-aKmk=xzAlT&5$Z=Mb8e9(xPA~5sF}74PLiNe_F#d`;1~5t>QCQ4&R#{u zfwzE8CqxVLk7AM(8a4y4?l_@3i?v$Uk*3@CLEsj2f5jArriam$4ZchOfN@xh4u=j( zby=Z&W=E7u;mY8q4?7qGOE?EARJi02%Y^Wzp8Yi!+(@Dt#Zaj7@HjvFOXZ@h8_7|r ze;_Lue0wJ(QmqrDOnm7r$k}oAHqVz_jP-HoFOgDJ^XICF{M`XEZ;_aKAz||>39*_E zmY-inG69*(f+d?Ae^VNekc#FLKfuzmLqZXJo=&;{_J{W_zeJz?@bEtockmGo z;Tb6Ig&?+Lf0)u;-T36;x^p#RlY0@+qZMJlzN1R2C_Qpnv7a)YvbVaw_J2ooB9^}J zEBt#qYF&ljy@lKZmrlA}o)~aE_d~R!0_Aa8*Cu;MXZ}6c);0iuGLK;sDeA+ND8{N) zG>Nh!A9FhV7YIua@U;H6tC4Y=5o-7gpz{!+%38QH22Sx ztx!(1S04t^q)PY6v4&DvVKP9=XA`HW!A#fI{kS)t|8~p+o)2!c4 zV$4Apg+jRcA=uof!CXp7&^o6mWw1QCU#&7Geo^>`uKq!2aXE{goGO< z+CC2?ORhz|JlE{5!f8Utwohxp?IxbTV`4U~FvMF`V&;W}-K!*w0&Bd5zWTE5CD4}? zD~(hTo4N0wF_1-fdx_$aJeIX(3s6D38MJc%9%$OLP%y3sfGYtXCkGZ5v>f})1zGl=wZF8tWd#dq*}n~eV|u>^f%V~Qt9m`H9z!A@4U zW>K$^@1QMkx~lz54cgy_%qa#Lo#n=9HHz%&sFm3n*S}L*_&bf|Y|2vBv<8w*HLR(a z#)~~?Y5I3I>pc4IV?@pXC=M&a8rp9kinUq}0Q^xfb}QEGN6m1_IqOY%2{uJLN*CMH z=RiG)rM2x*;xT@?lWFKzm`l#;SyiH@C|S-r<20hkY-q`Cj0*Ps&yROP0{m`%Kl~cn zEgIfH!JAs~)+4c%W~VXckAOC9L{#nHH$NP+FC^?=C6U@JlUJTsya;0{?PByVF1v51 z4GW?pZGW@4da!eg#`3r@G*MS4ulY#x%ban-ZOG2y_vPQuMZ#8tJ6Q%d<4&Nmzj3OE zOx73rZ;Tvj*2Naz+%LwTv2KwGj%23BlIM{s9Pt||`;PR`uEKubxQvVmWYU~_gB2Z_ z&3~<&icizapqq_kk%B<~;H1U-R4E?lgf7;Z)P*|tz6E0^Z7BYwbP7&5q+`0o;!Nyu z>DIj3bU1k?i~}Vef9}J_lY`b~5iC$b#Yu#mK&b3TG9Rjv3FpM3Ezm_3Lx?KWuk??H zx`1r48}Gl3B6m!ZM$)tHBjIOPfr7E!X+5m>m(`$&P{&pKcS54&yL*?_^5N!v6a0?( zEJkzD1tV%K7KI(yQC-Xc*4XJ=RbuXigu|;Ob}$Rg?8qF=H*vy_b^LOkd0AOR^{Tgc z)0W073+me)<0Mcy4Uh-h7l*@a0($1uWla9eG(3c{mZKDlbeR}|u89br1(~tL<^l86 z{>b4G9e=pIAJ_)Qy?t(QAf>o}TFF5O7*`eZRZnciSB%7vCW%n|%V$da=j3v7_&tVh zF|r5r;TXT@3pJKDZ16bnjrnRuX;{GZWv0BP>Bpr*ZO5&hLf9}&zLx!Go-T*kXK8f` zl3)5!9Mt>mS%UV>@Sco#LZG{mHlZV{t_HmIKD%x*2FUX{leOSwYSy|K2L|_mmdNy( zDm9h9TM7R1dEj0O3H{#@3$(D*fn&}%v`VgIXmQSWLIQj3tM93AL~6yBC^vUcl!hG1 z57Q3;Zp~!RPhM#~Q2TF@n13PR_$rA|Ehn@Dw9b9>{KxNdw1^q{|JhOU_;us>bOyGU zEEKMw(Gi(0D7h_i!Xc5g!!Z#I12=y&kqt$+lW{ty7z zYPjJLyMaig zI&ffpsT+~s^4}t{@Iu1rRT5@)t})ENDCwE$$&Q*9g9|Q#Gh07-nC&2SrGP(H0>a8? zTgX^NvVXd`mIw5rhE-b3%@98PMg7_Oat^Ty9SmXZH%lpw>9Dz#cs)iQ=njBXep;=Mo z*R5L~Ctyhc(>Tm=rVZX3tE^@^I-g(Lm4edU5;8=nk(PyArCJS@%TgDMJvWD7(r}Zu zY@$ahE{X%qaYQ;_3jI4vv0AytWp?N5wZ<1C`Wm3O22+F3E;XD)be zH=!9&DkC$~bsk2I`rHm|KW+!-z08CLv`<#bYI%}F_+I=dW=Dxt#UvJv&TJ{0NU+Z3uz zKWeHSpt3fAr55x1q=M*>SJH?Sbaeu zgfveTs+ABQCzwDrd9$uB05%o@C#*O(x(@F4gP0TO%)>KwDNzjC7~VB%A5!kiTLB}> zlsmhKuzMz-ZAECx$3@GhjQur$+b|^9w%1$l#{f1v#6NT4NB~@~MMX0y} z=!n~0R&b}xfrkBMS7S$o9H|dAJy5hBR*|Jcs9vrq(<7rWS?`Kl` z1;B|XZcrMV`raAGfQJKr#$H|r0RB7>zUy+^Ar`SbBp)^&^b~BSm=69bFFxf#U(~Ur z2ivUN>fk>afD@#?b8W+5#yjKK98rno7m1mpO$DnZz6JpDT+lxR?Myp`kcdD#lT;fZ^W+0%-sV@wA&P) z|8T!I`XJ+dE1(Yz9ypmfZPeQAXx+84gDI(LXw*Q=)Sb}N)hb@Q3HgO4`)2F25)v?D zF}jg+T%}U$cfva%L1$z{mU7wQc}BrhuMUTF1#>SH)r3eyg?`iIz`g+<@D_>X7ZSf- zC1EuBAL{~A7@f(flTEVjV zt(%|BQ@#@t&ggi7tpsZ9MsfQ8%3T^SIJh@W+v9SOAg;XXk)>^#-XgK`Lc;Y`674%% zmIFeWYJA>7*e-TmTIgveGXT37W`%A3qr71$yAmJ#Q})npO&-6QZ$(OHY+Fr~zGuCi z?J=fk-!qD}i~&Fs&vNpq@KX$4)(A3h3&d3Y*&2d@9;6>>s*_R(->Bl`p)Z?yZ^W{7WkeLC;+n7E~S4zo;=pC994nSMxjh9LzC6|Hp*uWF5HOlbc+mIMk8_ zanx@=m4>$Hc6nU_rr9phgh3tJ)W63&gc)X!X3Sj06#g7AmboR} z{WEVFda!HyQ+G`2={f41L^9mnS=fXe5lL$(lEYkx0RVRRia_@sefse^QWc>pG`(|H zEbRi(w3(s%FtB^uPj|%UXZ0t_3pe{vHwh#oEzTpR9WyDPlqI5#PZ-pzi)zU4ghYK$ z^c>9&tL8$)lq`9U9j>??C)3XFr7u9ca}VZm?>9djYcC|+UnQ}r{GYM#1v{5^LX@OI zhI8%sX2jS)#z+r*uG;Yi4^y-Sl^R!?CNzeq9ouB8-7f z8Dv~zVEpu7=G7ev6wr1sgDW@>2l^ePv+R=cehO4|11IjAFRaULiJw)`_bGAiT&A0x z+OnC7Sr$>pZx39GlqEm1X%LH+BeY)T%>_SzqK(+)fVTP;*z-!h9S7D>p{AjIXC^^r zb}m%D9C9W8cZGqw=EaBS;RUz-6S`XV_W9 zW{m1FKhNbPw?2z80olt8(`7CPyV@=eNq%a=%M3qPX@!J#4(Xjj+4$Xl0FCdl76>>l z-{>F>;(H)$$Hg2YbotTDYn1=3QW@8bK<~qlD(!L|TBHQW?&kX_RJL%cwHKd`V>+U> zNG_#l)#3}9D&5fhN^!ls5L z04DZe_>!TgUgVELPg#(1b-qz>9jGN(-l&2e@Li{yKROXUmE&jElRBF?+BC|;51gm% z7GF-ada}p)={8zSNXc80D2l{P^N!%Lp1!deQ{-;JhKm)4;8O?hv zc1uD80ID(1AyaJzeUHy(yck%i-28_KEi%VrSb)kWh;@>C5}Xe8pIL2s{Te;)IPddn zgB;jItiYnMjy{(O`4js62N0@wXR;fd9qhn8XUX+$0~MRRF9tAw7%+@@w*RAE7%DLk zzYZin@I>8M_?Irosc-SQFl0B3P^bxEmUGxENvG` zyH7>B!%tZ9XXisOi?M!-#KsE=uUAR*5A!h&u6-#Vw8_|8`)GPDGS)45oI|~xlosz) z?@1PP{;A9vjoeDrYt|{~4&c7lr@y-UV4u!=Qp{8cn)X^)JYYiE-4g*gA*gI* z^!Nd(5Ln=9LRTGaQA;@#5>Mbt&<-gq@0QLyoogPH`+5hJ473#bgGipj6rL*XkpMu_ z?<8B%?DpJ34gI81NtJj%C8SP+O%-8kj08g;lgYq@tW)tXQ0Pziq>0VqMSgZJR0y!N zc5j5x-a4R2z<&fa;RMT-;uve8d;sfGYvf7o`;m2tESYNd-yK4i7?r<)>plX0pM!jU zx#EX!CO4$exaiIbA3CtKTBA`9i|`RT4ao{KW9RLsicaaag?BSuh%di|3Mr&K-G3Ol_ zjmgj`N{b{;;Jf^4>pU4{|NIfUqB{)_g0zL8cme=GavA0s)wNIX1>|-caDSLjk|pg# z!NO3ID!56iPK#5n*a!NHX}aj>q91d;22eM8X{0M0A>*MYK7?dc#GiLef_g8v4SWGQ zFhy7}w@XZo0fxVGA?NQ6WjvUowv|RE*RtUYcy24I6dUpgd1^SMaxOhSQArvfo0%2=8 zj@%v%S$R2fieChAjJUS2ZE_;V_SvQ?l3D|3UJWWQK4uS*#H zbIzl^jPyu%L^xoxh!8`oswg#X!1twW;8$UPNKYn-kJoyWPD3_{C(J$vMGxmRBe-oQ zf_gS;zgeArSYJ54Kl~dI(4KW}h|(_h!|j0VX+uolm`dIg%CnidCdCPBH?eNfKmWgr zGWUo*DS`i>nS}bKMkmMg-bs~E&GU5|BKipk{*B;#x!29rCvH=grSiE+CN7Y$2jS1s zTO_t$Ncg@=A{aus95lPzl&kZR9&?FcJnW~DP+zd*eZ@C2Xpbq}SpsiU8p$7fWw{z!iV%IKRY5)``if*QUO3{R-PW3l2D9k&8!u{7Nb#z*&zheEw0HQ{Keb3 z(}qYYtR=kC_}69#u5qSXI_Hip~Kc5RfeM&vM=OMmRR z41<+2lnWoK6VyqcJYWX~1bnk@2FEwcjBSrIOg#TN;}DP5U_;mXNk_{U2#JetDFGTG zq%U;)oD`TKtt~%q^m*NpT-v}jhY>bF;cyH%zcGh7Gu>8pXHyP-qAuzRUNA*3Eszk% zZcoAjJ5jnJ_g&%hJ0X$CAp%|&%|+`+KJNID4AQ0`+Uxfc;43^IvwCK}EspU9=rnX}+$(NoosV^#$!~e1eW%@$ri$zlAW2`1D3uFdD*qxAZ z6w(~QtUg(CejMDEsBpjB*_hlepJz7+sH-NjMGD;& znWmYGEVie*E^!a{W^Q3l4F1##VnlKNd(fE5+}}pyqtVXJLABh1&xZjDTC5^&eVSKj zGB@k9P4%tnc9Fn7`S;s`HjDm*p=2&90;VGnu##!^OBIei-ljyx9K|(3^{gH%7V)`Q zlipy3l=PjDu&}^$LvBAMKZSeBlaVv~&;5zUbwb?(Al>tK={Xl2>n#$yFC_e5C837V znK{a?Ulhm{?qKHdMEzw|J05rZH^&NNgMfn(4om4(lkGA^{I8i}k!9}90*CqhYkNDD z(<@2&)Hb^#?GXSFpB8W3|1SJ@Y-Q*G+7(zTioZ+?>aa>r_&;mm^L3Udr$}nAZ0Zs( zNm!TfbDtfhhx;)lm9*vT29_`qaz-OT|18c5;ly$E4yUs2zBaO9EIlTsRLIG0XPOA7 zc+_MCXvp3%p^ijg58ma7|6!OBvao~M9m+&wtuV%Ta~F+IgGj08XH)lUUa6NTGLQV>krfd{PQvMp6k z?}P+Fc`A#6EzhoZg8Cm*XL>u+&qf1j%JfT!vj=rk=T175%4Mrs>uOVQ17D~ zY@6!e(&ujea%78(^Pd-8R)p-Bc;Iry0>4ktKbvdG9h1-{efy<|?ZrFmKYpQ94cwE@ zk||vVjn&XFr?k;{s)Ik{bY+(j8Xq|Y0re4M(>S&clUa%#=&xIoxQr-lTdTlmX}vVB zRVdXZrF@M;DATj&l`JG&TEhXrl35nnzjz+&fsFJPODA;`pBuceAv|3-4`g=~2*D5{ zMt(7rGuv*? z`&@8c$`&Pqi_j4SN1Y$U)0o`MHZ)9bQdNJgJ-0t0abg^ord2oJe{5xbf(A zfkjY|@>lIK{s~`GU(0g%w}UXwY$vEHl}b|FVmw2KVl}1OHn7Y!{gCah1RJ*bz{}GN-zQhiiA-PAdsF0-F0DB*Og34toKtB0g`Cefu0daGj_6PQ zS6qc=ta}$@*NSRQ(5-@LqnU~_1T|9vP5pN=-v4MZBojp2$j(b7()Tf0aP(0boqkn8 zsP(X^Kp^RfbFRepmr85TL0SN=e}B``U2(4m-HjBgujc#{-HnH~5o*QXXLoj_SW8Ed zc;Y58w56d-Tlix1%n!pMkVv~I7h3D?XKq3i&r?Pv*EXsQV-7svelKSUAq719Bk58i zj)2rN=g;2t-G3x0kV!&of1I)$`ey!2fpm$URiOIe=89n=cTg1LYR zQ~gb@0^eaRy7Up~*(=_^koTNqSh<>$%j{I}D(5bu;Plv66ZLlvf5jlz5VOm7!E0z%Cd(dj z7L<%0ZGm}697BP2;b|Ke)Y~-e1<>O-8s6KhJGcg6yxX|HyRnbcVh zeQ6}Dq8_F6IUf>xLqk?G0BpnfK%+}6)z~d8>E!|$qLYWmJE;;~F`Gv+Ct->%iBt1Y zV^AZBo&mePM$j^4P!eC)2-uO{BJuZyMDVL5zCg7x@i>``@SJCZT?W;ECph-wZb4u%>G5sU0NSmdjEV17A5dyR%+=UUHu+Q|EF08Lp)Euw4z1opwIww#La^S7$F3GF-E-~7kC zqQ30G6^a`QIM8`i03eLihNzM=k6geaa;BmaMWIEo1a=nE_VfIf0TJo6!cfm)2QkkS zkLa17oUI+qK3H|3ZBJMeR>-A1%md8OL+d*skww@nb3y@mH&Ny;e)qeB9maw~v@o0{ zUCc;D>rF(qcbN=$xmXc>a)cHbO8)e`_zmmlT)2|#C@F|p3sS+5-nDOo#( z*366&nqCV<*XS$YIwMLzp-=S`T9HWos=_w?W1k(1Vje?ntGu`F;m82A$O&xule+`E z2i4vnFI-q&_K-HVT7Ju9w#L#^xl1nxApLKEk+p8rDCG(FBWztOQcMDEjeZ5c!R1f( zqE5PHI?zj~%|Zo$JVu2%Ea)IgeqTDkS6`u3gEqYYGgNNrtag@Mq*Gvl&1j>8Rgk&e zT~Gj<&^QB5cpXWlE-0wOev;|-osg(({d$AR8-?k|)nK%tnGt!oxE5}l>oz+!qU(Nk z4H@8PJPNh(4ok;B$Fhkh`iTZ{XhDEH@^a^deg&$&88+iSA|8TYkViZ<8T zfX&5V-%hJ9%(eu9#qZ^fBk@2-1do|(i@Vogsfp2MzG(17F_`arUqEsO0~9q8>susF zUPy$$O2Q0QRhQh$Hy&Qm9dLL`XgPq+PWnIp7+W zea#>qg|QD@NvsrYxZD-27_==CN+~m<+@j=q1$OT&{5bKYdwx=8+oTv>$81I#1$4?TxE38jsegJ>o?qz1GWzgM7(X~-Z zY{)Gv!?B*s)k@Z(Guhqn4d9r}W&d<@>mm`kvVvsU2k`0nUYA{ok}|4?>^X)tN-hzP zcnzr}dm}IZom2@2xT|BlCyj&X3FwVLFvTxR3{WHt|5fgA_jiXYKE$TIMdI{@M8vBk zeoS?4N^=X1B@#bb+u|IHiYyX|F@`BFoB!v5@Ti_NIX5yQXjV$*dB|!gVqtNB>#N|$ z<~3B?DJECaB;hy(8uHENPmHKO{{-62i(Yva7GFm(f5^MCx0(#+^?m5aB|$V%=BMhQs$d8I;oKSQL(`<+rinYV@2Zn9yII76CPCcjP{JHI{=a2BG8CE zqA2b8jqq~-;7JH+T_`Gro~eNMW9Ml?2}?t0wx95k=W5Bs4s@1_cPQ!{cf8mSL$;@0 z(j-cvj?c5;xH6P51Url)G26+zd;s7YN0h1;TfceXH<=`SHWz{)QzLEPQSwnTD68i~E|rzRL;uS<|CR2XP>DaQmH9 ziB2tT18@3dmtR9Vl2cVRm6tdrRX-qzSW;L|v<9w}^4=nG{z4+^RT8IltvEDEk zos!z}Xe&k=^6OAS!Tc0uJ*_8?zhaX<)t8+d&}DGgX=ang^ONuH%kVrJwsn!nDJ`;d zq?ZGL(e+S`Y$}5g$`w z+}v~8zNDUtm^MW&-lc2@f>tLOdpPljvV6ukH(mPtU-g=KAg$i@jYS@b^+am*y5@9e zstY>16r(eneOBcp3fkjRgd3tNxiL=xrVKp-B0T6NG-n3U7P_DSrTKRWA-M4lmCW38 zxkPeoZt^Fe)R|8@628Wj={~*DrMy^dJLSyy2}CGpRVO-);r_qQE#=Vb;NA&|A-|!& zbQ?WM_2w3vY*YUK^dUv$*AEux)}u}qqLs@H-y(7GLL&NA5;#lXbP-b;SKDf-Do&p? zg3PvtKLF#Ko@qUqJyFOW!5e|4Lg7+#;*5`WhWIJkXj=A=AM(G>EilguXk(E|&;Wo) zyx5G{7faO^&{uH~MBRag&QJHh0kjehdaLE~4+RVA{ZUCO-i+($dLpE8GnkpMN{jv`AtTHT6bkNi1j<@P7|9m8VKt;V%ZLqobFze z`gmuciN4B{(03psNm~?Nn`ib1l9D;TEda2(H-}Rmhg}%CHfq%1fIoh-#-L#@D$>?x zd!qEVm*|#g*pB;y7k06YU~**W9BjW1H&rpiLYQ`dGGTw}W~lZ%A%S?kG*hz$gTNE# z=nc6xwUS(oN60WbIvEuvb!_zoQT{CwmoFq@UM2C=PRY)Zg#<5p?dvahQ|@qv0eQMc z&G|7PH&3=trfvXlw0=V~q@`KM)n^A&wz$;(4E!5`kOT zJ9-x$bi8!GMDbW_hA^n=aVqW#5qf}DdPf36@R$>jQozfW4gmbAGA zE4Y@&El7>}>q}9ByDlQJZT6EjV~F{9m<`$Imp9FM(7Y28Fs8T^#p{taeP87-!|pZ;`lqArbp3iTM-$jBe%+n1NlFtVHh8lwDf{cG(g+Zkb`h z_3_|z(7w-?e`%EWTh|XE7jWG$G~m~M{FYY@iXCVpg@(^8L(k`8Q-WAZrSzod%N zXV)-}Kb@B`=8oaAam<8eNn{0-d;XU=^~e7l-wBBnIxzU{9xkDc|3tHvXwd93y}6e* z`jxHizz!^IoO03LB60mfBJNcZ%5Dh&)OaAY z{83B(O*Nb$W!O7t&kyl&OiIKeMUr((2tOm%aIyaP4jZJ*W3!DS#uI<_ywZIS_{ru! z_2F7@*$Lxv(8L)_LL#ed)MEN2uJS)zce>JT6jCb>j3M7VyeCi+psd^JK28(zCbQHf zbqcCsMTq`N*L~gD`X9FZrlze?hS*xo(zTqo|^nz&gJFuqWJAks23)esSSW8S)HR!0D!jN8vt z(RH#>*6a*%DejQ|+g)S&}?%lQV{FC64h)KCY>5_Cva zEPI(4W2{!-;T$#Y$N?pgEju6MMW%c#8;Wjn|I8SgS7fmgcbnyE4FI-%!lby5)wZ;c zkLYg!>vuG|$|x>p5@HG0KexcOXYw@hHEwL06VQ4h(gY8|B(cC?|8B#p*Pnk{o0j1Uf7*ff5YpqJPF zqTIVh4Seo2t>?1(gJ}Yf`c6pX#;~w^l3zy1VqKW{;_fV|&DLaAe$!LK@5PKVSg4M9 zi^S~GfpdBPb$RMnosVpW?`+sNb5P@p#fAjSwM%sv z;1^$!K3CI8KwFEUh`lN&Z>9B80-YrgzPA;s(qnUS4Bm`%Bh-59m~*F8B6)>|q_bs7 z5dAUjh%2PbB@B*NbCr%io^FCBe+gcbFApmqY@=I&YcY; zG}cWfHB2|Y4vFq+*0LPo0<--+IIXPH5++tV1WkS_u!TA*-B_Mj08Ft){n~N!1+(6u-&tl4fr`P&#%do949&|gNPMR@cpPld4g^n~ z)X2cJT=0eURf2=w35gUP!5en0naVNZs>4R(F|C-yLMot$DhcXJ^>Q6W$D6@KcP}Io zUnPM=U&|EI>!mD{W2I;Vv!7Bcaej`XJSRStcT}{wpyjm-GmcRpeu>oRQaYizoh9xb z4}BOPx$FI0iZp8r4^9C9@=NZqNW*@z_fR;o){d5hn=7CS!G~g4B#%SMT2QxT&Jp%Q zOZFD{(>m3$49rW@mCpNbb{5&2fWt`aBEy;VKTxY)9>hiQK1M_h!sz!L8a#b%3Y(|4 zE|-VW>i`l+w}WrI$*`f7m)a05v~u66xW~5mxK?qf#m8c=D>)`lMo2+Fp;|p5c~#OB zeFwH{7ybCm5ctuC-{nMk$CXe&M*p|ozb}b;%Stl zN+gE9Tk}pxV5IJWDY~LyF?4V}*+GA=A^VK9aNfe7;8ShUsZRLxW?=ID3yGvxNgVUx zqCZDkm^QN!tMuv4FNHw|wS=rTgjU)zv#ZMep`)HtyaE3{7g&awdA9ytqT9~C)Udlu z%3FwzC7UDK=@$U_*vQr96k$XGKK1dWKX@ZsiIN%fK0>Z>Wh?cJc!$nuCT;QybLSqh zgne_CQ(>UQSN|v;J+@VU3M+F2Mlqxs01#*DG~rLerSQ1@!!VI2-Z{y$KZvsJ7&dNWM7=MJjjZ_Fe#hF4~a!he0@gh#vm6TzWa9Kxs6!PwsctBBm+jO_DwSYXo=1KQF` z@STtlSS{ssQYL4CX^2PN#;>I5$o|0_lrI-@8K>}9rPUkZtq;e)7ZS;@lCaFUp=fgv zmLKEVDm0(t{WEEDa5O*}_{dCX?o9hL3`J)D6T&^vr{~9MIfo)c1I_pL%)T*ooN(~8!hr`)1lQ+}>-o+B z=D|55cI>uQS7ZnpN~I|3Tm{%0j$D;Yn$=Ub-B2mRLT&({e{v&&^aTY$NZqr(A`>c- ziC@LmL5@=yj4Ry0ey`N;E|uL%92j6)HAy(~s&95I(sQ^`+t{i;)4pAIvv(l6vZ6{5|VJgs`)BJuD-BIQ*Ql?C@OpIpoX^0%ts zko(^}!X;+8t#pHi{RkW}i1_UgCK6!QOc7v~PPpo#TFD?IeK#x^C2c+UhQS%q6j;xN6Io+F@_(Cc#} zks*Ad>9kv98%F1(^gRi^#|4+d`y_^x<*T}jq*Qg1lj%s`Wke+Y7Vl2hfptk4s*@FD ztWhvF^Ee9HbkKElkfxNJyb8Hqe=uY{+B$1oicrcLntZxpn}ZNXPA@`2y?6WBl|4Cr z6WCRinEDxG#w2o$V%r$BDP)eE?sE{RjRza5`=REU$Yyp}#t{7nZ--vff^J~qP$;24 z8?reLg_t;YqWBf=USLv=ErNRKHT@%m9=EZ4gHNgWu9ODfdwKSHFBR2LT-SC|yl*vBm-;kqk$WCtegQuCiWsVD_&9ldjB8o}bu=mdWIWc!Jo8*; z>qqR<>9F$l^-iJ6qvAaYtg*ga+2Q2P0nK@W7Q-S>-3tfs<)z?`B8rkyGKlMD#&OAJ z+JJ(IrauUn+J1%Thif!O1YL=TXhCY}6qlw=DYI9EgDZzCPm0(4iJ*SK{Twnc9M#gu z?YJeeE(7?YT`ZJf7-*TK2wLPs7yZ5HOH7;B^B0nZEq6&!ud1@>h6tbMPXsr_2-{S7 zzQmFH0mVn5KUinwIv$APyO=-eKdxySG0bMOS>YtVlPb~o8H)UpoUQ{*jNd)^lxq&t z+3B-QM!fB&TPIDTxgg0~RpR-DMEa{FL~|wUEXRB7oCER8NXH&5rH`iJA86eo6-?r2 zdAN@-G^jhjjo=%{w|UMbSIJCj{M=8S>hZjUzSXrjoXk!JwcOthwctgzJJW+5(6jht z$4;0@-r37tp&Y3a%k9oykDTmW36JfbI5Xu1%5Tt1=HxjlI{t?;Umy8zTDuT4Rf!4I z;|;-AvjlH(YU;4ZTZ0+0yZg!ZQJV*|d)C7m&)15Wmui_rO=)2CkAgdNi`p5r!1eyM z^?wj~BSro?bAfOkexS#3utY4Wr7==t&RvVxG`tF3c8TI{8y^jDs6;)+DpE}6?mey# zKWN&2R`8))+-mZFjZEdfVHuX5Da{2wq*gM#6B5L!{FP8r6uamN85qga#0&QU=eJrH z%UZxzwO@$)6K^){gZUI`fHZ(*yh>u1Bf@i>`dkhY3I5}p$#|se18r7ShW1%Q`b}CR z%AS92H;&4G&=c0E(`~G-dcRZrz=ya_gQrzeQ!S&6m6caP7fl8~zd4sY<(YhBX|ybq zCH61^qY-iNT;z}-AIaKx669k2m5}{?hO`T^iqq{wV>+Qb`qo`;V0f%9z*w788I(uY z)s8s&$-EYKm-!=4({A0uFpDt#fugDD$CZ$1cT(Ken+ME3uF*k$KAdD$j+KxF$EGP> zSL5Pk+py~DSao_(qup6hri7G3!+*1Wk9j4TB8@>XbN?Fd*eypG8#D;9&sD1rIDofU zmS*)gyI-dmc%qYzBjAdEHhFpHRucI6WWSd`j;aJFd2oqSX@WbM+M|Cd)Tlj!SUjeX zI}C$uRhwfLN^eyO@D~!9uaZy|M?N`D=mV42VwW?+w}@Ni<8UUnL$mV_2bb8|=g`t- z{MVQa2hb3q!b)>yK|oE(wbX=d*B{nw0xv4*+}Z~Ku}+N*c(Q2oiYU=)OiS&X0(TLV ztSyp)yCJXmZ5EeSz(`Mdd!MMsoC1+sqV0usTY7-(3Il)oPvO!Cb2*+t4KOI+0%VA7 z_3+;xcnHBSHld$sa3r?~VpSflzA5SsVU?p67b(r-9@xlAyqtZ2r|gajuGzMOwCX#pk#^IDaZ9%8vr zQCYy+1SgDR58yC2D8F~XmTs=|om7cY*wO3U-`AeIcH^}deQ8Xz9i}AqHvzXSrh# zDQBdOis?ML_mv6Q$f;2kVjBo3UEDdyrvnpw5tZ6VB@wx|;PN12J4iSnC69KVXB@Aj37`%l1*+OSeAPG3MKT{}P<;1#92csM^ji z3i|XQpi3XAGQ}Pbfz=ow;M$aLD`e5+kF7-wD|)$!q82w;i!eViBoz0{f2wqWQ-Fg- ztu|jzYP5^HZ9?DntZ;ZIBq;R{9}e_jTY}(gFfZUWT3k@C)}0!Op&F}Wd+kVLf4o&C zAYMphze=K$;Ocxq!a|cOt`xB~K_K2aOu6>5=ZG*zxVaH4s;IS^n`s~eKTkM21B{5T zS@lvG4ik{Jiifk$XKoE>-|+?j#VrN(ZDyUI>S=|{S=V|H8{5T}k5?tPqkAs0+X*`9 z1ag^9Js->QX>H>Vcz06kpnZ_iqw2BhiW(db(;u)vzmS#~Z4{*GN{hGNH0260x98xn zxJt*`&cdc=Jif%OMD*?ma;Mx%V?~CV56e29M}zr!wlx{Y-8A@Y`>^44uVIy5snZEE*w<95JL1 zaunBOldC)57ENGy0YFdAhk)Y>opkE~(N34*t|@QhIe8c-D^58a2Rn^H3r7ie32|6% zM$+W8v35Oa<<+g=rgYA=d*Hb6Vb9P>Bq)VO*(`z=hK2kC7OKH_aWWy|XPY6!CJ3MQ z8Zp_dn&v^>O4A;{p*p_4eHw($1KF)a*X#)q?=eg5+Ub#MRvr9t&|4~flLiD07kreU z9%tJ#H=P{TgogennTu!G1|Ox0$}P>Ax-WPXQ8PE6hoX)y(&#(Z(D^DcEsih0gfbQ2 zxyrs15|?M&UI!}YDwdgc0+xGE4=pyiI*25^XOjmI{!lInjBiy5s238suad|e8M05! zuK%a*Oli)91LHt)Xh}>LQ~ST_-ZG%7Zfn@4bA!~TySrOr)7=fy-3`(qrAQ;4(y4SK z(%lHs($bCex4jSNJkR&O_tEqIJFZ`Qui0~5GuBvhj1l>E#O6dALPIy?RXegS+R7qa zL#IKf7S-FeVnU8608y#x`OUGv@*Y^zYWwR))2Uj%0xX3ORjd*z|Q4c2u6Of55aofb_((&7+{aSzy=!=SQ+o#*!WRP@`4~q zfds-d4V`YRV7dH_I@&k?$|e6jv=I2X3IS3Q%<*q4zHG!BH+U32yA2dGacB{-B24oA zV4?ct9V*wOB~!CSGZjM^!iMcStc6bd^PoPnlTRUOsVR9_w5@SK3E;U9siAsQ97~L zA!@IP1Dr*xA~IB}o#TBS`X>XxmZsKK1Qxh@nZZWVD@RSKWbUi$Zuza-ztZ5t_haQH z;}&rC>_0bEOwvWRSb%Zo)YCqEp(B=TT(pFVX8Rr@2rOvQvMlI^Wjvxe)`-V$*bH?l zD7~f%f>^dN8ZWegp2$!Y7n_jy8aOfkqr*A=VS0G##xa^D6?rozTf)b)2rz&{~T z^h+dI)Jj6kCD$ZK23LTD+u;#q0j5h4Dy&wl2U7;gP+kle5bf+oyLV%YQ;=y}VMQS_f^6Psy>Duj(_9C52x?2#>;nsBrIXke=D)RvL6BfIp_ME$Bw(z zcCxZlIBSP-d~e&|#uqG~$_y`!d{fzNp<6{I=eBxLA#L);5V26+3}sZ59NU^uc(-DP zc}^y|m# z$gxp!+0H2Dy8w_^g2r7L9H*0K(xNw6v)QA#fs2*YnuhbT0ND$z?#@?Y>2Du~AgV>n zad`$(&J6P_J0@0RfK9Q*3lAWL!XMxRy^}c)z{}bCWJ?20x7m~NJ92hI9RW<|Q*P(4 zMQgaP3$3%#CW|e$KS31k*&Z0Ha1lmZnnXvKbBeZW{jXxQEa$7c>e5nNFY8TQSwV9uJaU*T~9Y? z)sWFC=t<}Goyy|N7BovPkBgMD5C~WoX!5N6?cPUxBORY{Y)#>oIcnmG zws&b40eqPDgI4u{o#zW88gIBw4*#6pj~vMTWana;q5%d*_|bQ+@M2c)h^<=t)Nt@K z#GuN_=^a67Q=DY9vFO_Z>Se}Yxx{P!+K(Pv!EkUlwFa3j?zIUwwgEuQ0}JC&yyy1vD(Ak^7CE}H z#sy;VInrQHA8%`;OXU{>??Fsw{Im$p95=6t##M|FSvygqXT|)-1Kh=iIkKq#5G0zq zkBq766j3TiLg%RUI8I7KBk4t>TI|_MZ?iGH;6DGL+s2F z0Ll_DpLy=tHJe-bZTN7o*j<3S0)Yu4kno)k65SgnQf8D}D^~{`R3fR4p&<5~M`+MT z=t>**&EXo60q2vDAJhPlzya}k#}|n8wh2ax_Tmei2=$oKwktcT#?ndLp@(t^Ia9jr zn~62TVc%F`+9de`!iQ;?#yd_oT3B(#$*`m&0Eo4=pu9^0Jdh%w0*N$sWnk5nzAbd-Wz`^Hduu7MqfGCi@RT!sGC;la(sB z*9t2_5D+(k-t6ZfnvC&&t0dXv;bqC;Z(Xz?KOs@}OC<8ma*opq*JjUZp-=DHF={DK zBko_DQ`2=SRu~On7P~93zCjc%p0u(be25dm@!c0^ydGgRg;2}=TxltpYXp`mSoR%= z6k6KAh>7w)gO`;&*nd7R5arD{uJk!A{)FSl4_ z&YVU+Bzy-Fz80=Uez2{!T^0YzI2jGLalx$_p&`-SMP&&@A$XaXd?_nw6Nq+YO@NQy zAD8fOt09eT#nI&6!do%{q-#UAL_It{-@ok$WZyGu1BqzndihPe_#i5(%Rq?n*PZTaoadAr)G`mj%;mBqSFJ zw+_t|;>Pkq9h^dStc}?d{=&VkT(S|^N8L*s&zbj$^+r+;aVN07ROSI7|F_PPvgh(2 zH7X7;M(JpL6u6qNJd;W0&ivKii9T-MosI65NPfL+vXE~4_(F11LyX2p%)^&mc{C-= zoeEMCd~%Zcm^Aw0F%^eZQjSNGP8GlEQb&R3LkT3~pn}%Rp8MdloUl)Z&Lr7ohR+n_ zaV1`OgPb~TN~g)8ki>*pnES24Tii+1Ysig~9-9woQI7~es#aCm4Wdv)aWdGV$k>mm zYc1#%NWSzIW<5mBSt$ggUYC&vVn zs9%0s%KY}`b;Pv1sK*RZy;hCJ1hs^v9>)3$ugWbAV69kGy(&~b3cciy8v#5DrK%&a zbzCv?3^~PqDSth&xxOr+2 zDC=cgNoHG#p=>b!J0wt_kf{765`j*yXU99JkAds0GD_GQ0pFE+Z9W$~Kg94MQLvsg zs=YO_(vCz=Babr9WT4f{Z>#m7gVb1S-LSs)hAB)~h5);cEm~KxT=dx!J*v%VJb0ve zE#3t-MFhF8`c~mE&mG&Ps``Z+;Qi-jCTh%1D2+t^ne@%F@HS?Dd0D@68b&4u00>b= zW>&5?_MJp89f&4MS~J|-M9+Cp?GAggCcYv}9~!k4pf{5MlS|nFL`C3>r!|Y$9fCTL zzLyU%SA&8UGX#J}ma2WhlAFhSPVY5XdSMd7RX9Z%%2Uou1<$?MN`QomUpkQq-h>2olMsY2)H6QC^gx-Rk9mg?Bo}T<*#bg}{q?0o=s zAtR0t;fY8e9W^QzW*s))_m5@CP>Laq&_01I01&-HP^9gIz1#KcF?@yX{w@uu(?%cH zumb}SAaaptgc!wfR2*XyJKJsedkbw%IMZ;x$9kNCy><%i{0u$sCv^bG7X~|X8qF^XRNQ5j^(pzh4Mq<_lof;os; z{oO2q_JqX8Um_vmvmd5hDzfbM602%om32GFDWnXRCGyp`H-oiaMx0p&-`>C}*_ni4 z5hI){dz4c(&Na-#(iQ zFF+$~5HAkFFcZ|w*MXKqhN@1eseW$$T~ZVxb}XeTxGTW0QV0MVMhZnY461~IJ3-4u zUBB+nBvaSXb#;hH3L7*Clm51z#VHehHEnLREu;uP0rD-MP71UOIxHlqKHCfRpROAK z&s6ftJ5ARO+;M!!nM@+PWxmbIsUFJt<6S-&TJTMmY?b0|yr|cN9Xql}v;5?wuJJRf z-X&2GrOQ59*;mRtf6Cd*xoh$+S9R)V^~Ggkvx=sdjc_rP2>AKC?VChW#H%I#ze583 z35lv-BBA!F$prplB`+s2M3bAgSUBCgWZP~|tBW$+4!Db=gs)I<@G8`Xq>8mPM#=VE zh*_l@m{ctF_Ubj3jq7SkI{4G}tm{qIK3>+#Iohp=suScNGdSYyI~xz*lX#u@=tv`c za^V6|dE7%DW?7rlIwskOwI=QRCg%JM6(t$88A=Xl0H7POD>RK^h?f)NAiZx4r0`ae z{xWeCkc2d~qrhVfyA62rH-7esQMNOf5CmzAcR)WZ$|iXUd^qK?*@4`aAV=_C!ss+A z;=TuV+#B^G&qu$sx!+Xa!!*}Y+ntMoxJv1;CDP0`o@-}$3PU%6>`LYb7ukVK-Hj{O zHRs1Hs8funKV+6bLCM_zbZ7EaRy~*&_=QMhlGWL#eKvH zdEoEzqWVy#qW?^)#ti_Pi=n01KB8!$mOlBBroQGQPkkBefoX|B@0F9q#Oi}6*cWqC zG*UBC`3-9-`G}xGA$e0Ryw?Jw%H{mHI-p1e0Ft$RdD1w+AUfI}hG}`2O;^lnvAP=` z1w;%?g?W!FA_Ga_F09S$455FUAhiKL0359wjf?uagx#hYN6eN7f(HP4DYo2(t@9>X zvg-r}Y#l&WVCYjNzj%sm9MA?w*)5N%s)yKX`w}V{oi<h@!r=WVGdDemD&>A_0j zRnmadAA*FarB#WPbBnbzM#4*GSO3W8NS}G{_~{MQi3E|%Uj+QtFcIbx5;ea>0)MnX z5=1u~dUS+$)D*s7JU_y$&6*F94{?*c0MoCjOvo~MNMG)2V?4Vr-9hP?F5YZnJ)g@tn z2oi{CyJ#D_0XF<-6YnLu6S>=trL;;o9n=mOis!d=(foclOJF@AQTt0I)|9&K?w6g5 zU5>m9W5O^EPsGy$Uwv%oz?!6S(W8An_Du+HbVRqBnK(B&#MiHlOP8yq!UJ8R3n*iP zdytwAR`QiQ?4Cxd4HVo_{+x?G7!l+NQAM2_$Go6I&PhN3v)$=+#vt&xKm|{W zCGQbZ#$iUUWXQxKP=Hwo7p?~Yy{!a|2indV+psdDuXK|;p) zOhCmNlmBhMM-{nx%zL7Q)<{HUNNlIV3CqEaU8dh50enKD?w3gH6I_Q8+KQ8z0uzt{ z9Eu1-)%ev^$~SfuY^i#gc-M)%&kbz8o&x2+stYw$Hsj=ENXW%h15rQ63CIzUf4y`9 zfWpve+z4&7x2uvug@#&8Q|Rr96Up3K^M~{38z4PNFLk|bCB=s)QF%D(s3ymwYem)1 zZhXxHoTy->XKJW^fHgW}6LQONJ~c#SzfxItka5(ztOzI#=S2N0vCy>#?x7ngBbcRcm+aPO$yUyEUF;t3;+O7rese4 zjNr!wVbYH6vG)6#{KQY8U$UZ7`3}jrb)Yl*6*sFfJ$?|-X>^@?lA}i;M#Z(_x2_wj zKSb`_x7LQE13;jW^Zpt-FJaUWsP}o$nq{S1K`pOgin)&lzu)K!O-!n8M6AOMF}sZ1 zw-g(99|m7$&ns4Z{Y=_HNV>Fd@M0DKLcOwq6X_PmUJFts_?~D>f7*9=vGr1ot27dF zJ8ed2CzE0f{o?~uTGLZac9NRZ4&vkal7_kR(VE~7NpY}@Xv>?X=M zqE{a;U{6<*es}a$!>!vJ$BELTv7DR9bw13G>UvFGURlJ2(+6w-# zAzcqxs}x!@<#*s*#FW2*)u)n1Cs9ReE-Zlg}&(7Z?g zjQT6Q7jatDn(j-3ta&6P`nM^x-`F3xl-BHeB3Oz4l+Rv;Je*OOkg#NY>Z9^*-z*VDndF{LX4hh^RBpQE-M4LVEjiTW&@QmMhwq2kJUCQ;XW~gRnivki_ zIc|pSsH_$_BxC1eHG&1U;juI|hJb9xVj>Uh-EWzt`6ouW^W~Ok{b0eSLJD14b-$a3j#5go!ySyV=(H3E~g76dkEedozy&_v#17{GfABNE$o130FQ_`fwpd%qDtVg-eoWA{@{@LvMQwKx5y~iJd#65;GPVqFmT5L*KJK(>^$RjY0RY-{`-rXGtXkABFv#ao^Z#c`eir7Ydh;KO6LE?JEii zmtQ^z4c_T8WMZ5bM#@sei~!AD;6t$RfV?t+|5!`({yqNQ`S}Q)Em$1ww+GD98(BClK*wcZdQ;of| zLpd32O!Y!v_1!VGFhVTD!rKAaEQbM8?CSKqV`|Z0-tQcD2vgDZ=M=`ud##3q^;29G zSWOc;)n^ZlN=dqvsHxo4kfDDF5{s|p6{LPda!9veO<#h{?-!-Ss>;~{t)(^xUa&h6 zY5oogf+r+eeu)H2atHJfiB#7S!$%#GSU$k5gE`QTSj&Sq9nC&MZ{Sd8opkl~w)m!F zy0cG?;Z4nH=@q$j!f-5%DVZ3)I{g~h=Z-N+6&$7D?w4Xq?x83^kvB|T%^OTu{o0q` zL%;e2oB5o$`3v(lE3JL|P-akWBo!UD&yT3X!u zwMp9*t7A!IwH*t}(fC7_cS!EfR!J zNVNVEi5tm0qbnHh>m57JQ@mwbDJ#qzNS8+I&2LzJ{S0E+I7;YEKKHODdDN|^6lH$C zh^MQEp^&Ad_0jn=w)%`|!vIiEFy}T``(!fd=U%~PcI$VH+_~HW@7tuT%NrK%EA?Nt zJ~lDs$*yb9R#39{P&)3}O8C2?Thce#=I0~c=mbE5ZB>!i4UjZtRo9*)Ziy{6s335e zSdrj~^hSJK)9tE?t8)P1?sacFyd662KWy!{%?)Vub<0HW-ZL0%FU8} z2z1tbtHY`Ehaiz}YWrU2h(2CL1Z|jcp-Iao4`GC@Lz8ajn_A<6h4F8V2@pLY(e_Iu zzDYbY`a1cKs(f&&$1o2?f z6=f3o1~P`7y)Ody9kim-W{Y*48muRF;R=$d0)o03JCGV8Lg@LGb>Lp1`s8vMpj3P6 z7^7FKzFAo@1%SA?Mfm2$Qfho`wr&jYs=p{whRpMsX3C%P zaU3J=U13sykUj$~gtTIKsN0RXTV`3O9$6%{RjEoP|Jd)4AbCRK(=Uu@ru<+S|LAx1>$wPm zwim;rU|UtZF zRQZ(d?_-UR;F%ps%wJ&KQ~0P7D-dMu)P@W%rxqQ9<)1gH5a|wC(CQlsp{LgwuGWNV zCI}ZJa`n#GL{vnttZA=lN)#)OXxWyJn4^+23Kx*YH(yMPkkMLz6wYuA?EjR5b`nWZ z@oOFnyQSf$+2@fBwQ&R=up>}}dstT(@`?rYVSa}M=@SwizeFN9ga2%kdV~*lFFjbB zRPyu$fxT2osVXN%mA3rM(CLkiTm4+Csg6BmA}Bu{A3HY4oPK{Y8ErhBsL4;9{0s{K zBK$sSK4fD76h{nY&&d&>7i+y_iA!Vx6ur(nDiiU6+I*EJ>?UMmgFjo7sYL9^#9iv_ zNS-H4_T#Skc%Y^VEWJ$Kk=KJu8^09v3$&IrHI3mqkNvK?lU{IxPZ zU*4dSxYC*V66v(h19_P_DI!}z3(waD_a3YX!pIgayeO0d@6JiZf$%Qm%FfHI3D3*|h zH%z&o7(8A{pZvIwpx(OZ88;o7)gaBXxh!Bamlf2iW+={49S&nEL;T=#dkglMFL?<^1Et_!Ah9P!EN+dsX6`E2rSb3Y}_srF&UlwQAP@Y6RiS?2J6rV zr|IVdu9n~E0U&m+8{EqUlmo4HS+JL;AN2p5~F^lMIpB85SYAoh%&Y zq`Rk^*5)y@PAm84iE)TSPfXMtxIIP=}F7xf{W(2anIOHy5&q9SQ z;gdFD!*rPZDa9wh^|Xhf^bWkS<<(E~82_iGZ)y7>RWaGSk+izk0O1)5ymK658&Zf$>{ITGm39{@Y*kCdhpQ`W(Ce=b= zR&-jUB7)OM$||bNTbVs7Zscq4FBhHiacUU)I+`i7#HqSPdVAb&UW%opS6}!8Sgg|~ zj4Hqyow?>MYS>cyAs+C}2||0#ByA#*=tlvMS`SBx zsW8^M{GGDJ222;hLL}1nmtakhw-vBOmgt|~9PScfvvPe%vJ%Skk70G}n0wC%b#W|~ z@*?{fS`N+fF}gSRs;Wmq)6srjL>S%BbF;~MQDYza4?*JVatB16dkTX^I}>*csuQ|e z2BnkZ9wrm2@&~G5M{3pI%@Pz(NOb)Yi7SNHju+yQ?~GGv+?+>hPMZTvJRO9$FhyFt z)3nXiTi`#|GNyh*LV0Kugnc%Uy*2cvKylU;9V6uUur1$YW)1+7P^5buQY{xpjI>*# zNikXb6}Zm;*if72mqmuGJj;++_eEn@r$OJuQ#?s>!G2}dd|bN@6XOR$UekBt+&xJF zYjj>;i8c2lkS61|=1M6*hRYS{(2ANm6fxO9OpxP>R>d&Kba{OvR&{Y9b<68>l|kO5 zV+Qh2n|$~jul8E7qy%gxu|m$M?3r&R^n^3#V9^oY@|`<`+`6aB9O)p)=gO8R!QCZ= z%Ol4HoyHS8{nP0Q_9k=LRD70-(*Tm~;ZPR&AA-auUP`(E@q^lyM7D%4W{z;Ioq5bu z{xd_>B;p9R4BNK9LxS=NiSAz_A!jsb8Zbtc*fR0MFs75HyW{)NcrdU(&G;P0m&@;{ zBy{~DIOu_1H7OTTpz{H9NMJgNf=tTmQ*UbjX*m5f*mRib*4umu$#*Dg`2)v(5rI}; zt_fnfr@SXFagtZEjOUD@qx4F>@6xn}$gF1i-Kh-#`eujhG|vTRoe&mV$>S&^(jh&6BXI}wTG{7RF>QY6xXkv9mr z)zkCHT^{^qze9rR35lLxA_2J@5v}$4ecGMKX~{J9$g##v9I$f+RF?MY#P52>r+e%J zl1Fa=u7+I(D4WceOM0ueP`6qJtKQ1pXJ=)C3G6ZF+cr|R0R5>Gg_cT~pg4AIU`B4N zDPadO#c{KwSwA7tYzD{Cv8AH#+XvFI3QX<6c|=2WY_H_cpL<%TUesr$0zmMvp2n=H z;geT9{)%_kZ&p%oS}rD%@HVL8nhKu<8yHBUk0pmIy9YX(^@{9}UX`&61INofWuXFZ z4Bv%=`We9{mlNMp4&oD`7Y{VL^Se7o29T9?2#Ch0T24Ef3iZ65^=cjMD4e~FRYcV9 zkvlHd60~3Oc$uR0mD%%4fWBqipW?_V1b^E->aCU{aok4|7TeA~6IDaWk{^%IW@OZu zWfo+Wze9rh35nicB7uS`)rbbFyGxJ3m8j4yTD@KNg(G5z($R-2xA^RhRMcTI-Qi5M zgS1VY!LIp8`(teu%C49HV}{{EyuX$d)l0DY9^54H=?X9>=7uNL$*(zCt#UqrH9p@8 zL2ezQMOS)U8|URKI_ZjhXjq2GO<3H8*Rwp!ZeHW4Ulk+O=2i!%!QM1>-Ewl}P&UKp zzJw~v!gQ+NA1q1Ibi4|BGh?x|RGel5B~fZ1b7kv%`H~dzlpI)Q#7;)a=($}ahT!-? z=C~33mE?*#W9k;_Yuiu|>9*@`{9+rd(L81Si|onF;+wQ)c-Gjs6tG={hI5XDII~IF zq7BJX&NwoM3zDNtLs4yxKSiJ|`r0lw`PmvhMV9b4$WRIf54v_AY^OePdOu&|3mbcZ z-yuQsghbyjktlO@-DBh!+3vntt1i1SYe%g(xi8^5M%E@zg$lu<%;gELXjC6Fn*IJt z@3}d-UXEUAZKAGOFOXRGT(sUk13c|-wWe1WUeJ5h&)$yZ6YK>DCpS|nl-p0g46thG zjaGUz##(`>P=y?Uv z4bDC{I^82dta_F=_J=GS@FX4RQnY=#vP{0nM{+godj7oycRFmxlRzlW0yXQA-yuQ! zghc-@kw_1_A61Cv{Xs4IfV``XqWf_I7=K>;9m}`xSyOMn9m)Z5*G^F8JdC|E11>jw zgGk_Qvn@W6rxJ4#dWFPD2_o3|n1~#`MNg>yEn89oT5(44D&lc4xBshR=3&I;R*7+* z?`{iTk7pT_yD$qOuu;z)+9ZMsCC}D0gxW{6tKRK{zi~L*7jn~#VI9oozaSQeFMjYM zH%>p!E#hGyaQz`jFw(HjeqXrtVC*PCgwO)j+ea)ZCn$u+etyksP8m>|@;fBxo{$*$ zB@%UwfR=@ZcazzjVp}=6M{&he5dgjB!dYb4ohb`SWW8lh83A$8 z>(_~?>AfTA3Yob{8!!NnN%8q@{V;ZlDLg^M`-@?mt1aXBa^~>J1D4{QuB~!Sr-pP# z!6gHt*QTePSP(*J1gc8G%ylm!uRAFzRtdFh0ifsh4k*3c5E=MljnsAmlwlMT$wm(% z&3Xh_Zh1dmFZp!GI(&BOaRrbzvwb@;xa)~u#u;oNFY$+PFoi|!rUe^7Gs4&!mM80uH zFF^gI>AxI_J1Foo1Ygl2=x>V~!m{O!dwHerH|Ybis?k)4)A!z$X4_lqe8ZVFwB6Q5 z8OJqv?%3huRi93(GHzi)9qNyhw%izgrl&&xgv1~?ukX;VcKe5;mAG(+tLyv5+rt|k zqmcIq;1Oz?KJwinIL&ExCTAxg!#sVB~NK3+arp1EJfXtqHBP{)3B;-a9c{ycqujktX4@E}gOE!WwpUp(f_9tsml z##Kw&TF(bI{soU}4{D&R++}ql5n5ZprA|9cT=k=55?Il=v)Pw%@&>XvTA@ASJ8p!Q zyYh5i@Y)fT!pcFNrAM9}$`AHC#l~zaAc`nt6y1#@ z`0n~xi}`{H%>R{0KtX81{6zvpAOtk{hkJ=ss;SUdjiu1y4{Wk}V!CyB&>w%sfDDpJ z)F~mxww%iM=x$I`du0_OOnTAcD!8PoZ$c76YzU5W(W;x)*QhJi&WmA`W2;N-ZQ;9f zHQV1@FxD%n;mqR=fh$Y15JvI0g+PK&r1&kp$1iX>6d8Dc^<-5>l~xwB_X?zS(PBjr z_WNQ+LhO#%xIfk<9gOk=`5k(etuK2u8KTO-)^6+&Jj7vzRx%xc464S2;T+OuWgVyI z&4Ho3yD+J(UtHM~OFa)BO9PiiZ@NC#pmJbN(IK&^<3lG5W7FUx$b4AeVnPsAnNvs%d!{QzEgeiLcNysOnoF%2m^t0~K~ zfv$a)W`ZfK0;uC8IID4Ag4JhZ|M>u@fCE%GggLV}0)FN~T<8P1jpV!{7x`i!p_p{p`o2u|$dvb{FH*02l`6_3sye zq1X3f(t_omqnJCfWmmj55kw{{LP+LyAYtd2%S488O{7jk(wt~c(mBkXoc!NnSkre? z`ErOezRLk!4!d!J^(vRUbE!7=MEd3P@X_do{be6i6L~h_e2_jF`duyYX;*CuL2-SL z7sqh*L@X)|ut~3$erK0XhVpiT|A7~iau@6sn8ZO*bWs_I(cf}@nCNn@EN&tmD}X*L z5^!YIkTywJpf77*ul)vo>a=+3jo8)%*O|Smo^7SHg`b>0wCd0)Sw|ayKHUHe8z3i zeZ~PO|H{@BoTUxgs15okh6`qg6)b!_HW~Q82LM{x-7T4h8C*rH5Zo^)WHuP!v=~1l z{uTRYd@I#lkqa_+bUSwoigWM`?*Tw|b96JdQ*(E6vhzx&!Ti}iD3Itgh@UYg|B8WN zW^QV2Z*1q9O!Mq#FvicIhQESf9E|PFlWDMi-Uh&^x|`Vj3`_qj49?Zd-o(-FDNg{j zs)p##K>xo25lxKkj2%qPl`N8Jy#N0d{;Rf_;F@EO4nknn(oled0ne-*JdEwE%}9;S z%v{V}U9GsMRN=_n(H2O-dH!r8=BTd~39}D8nGF`Wv;HT0aDWZg|LQ1r@V}qcxPtuI zcm(i+a&WaUcS)u(1>g8z-S$^4fZ$pH|4|G2pS8gLXDw(fTpaCb{=PEkqv)eH*x;1d z|42#uGbPr)Qo1?*+jQV&fGZEKAX*&_`Oj3S|4e0U@96H}_J1`R_^(FefYagpY-t@0 z_0NVMMl^9J_6a>fP6!2OwX zmd($fe}#c>{4?_Zbm7lTuzyBG_r~zX^u~H3^B=55fGgzzfU$P41{10e{_{UwZ57@% zX+~y)=QI8ncYk#OxD>pfS^eLo03iMm@^^*&MGE>q`^?eF+{M_<+R@>!Zab#aZp}YjTxs~e3emW<}Q021xUSFSM!v% zn{ZWQ;&p>F+e^Hxv{Zi}Cyp81v9@~IA!YsWh`BHkqo@9gF0eYlossEj!5RU#>fbL| z9g0ECf}8`^+g9RUa?Bsg%xS~O?JH0Sax>enOxB5FMs4&t!;R4ed3!1g0U-d@m#@*e zE{yk#U+fX^Z1eCJf_?U=lBH&zvI(8&+z;zsUD2Vfh!6UZdg~l~_p(pBmx^jWn_3zPs!#-E>?R23v?7%k+#S-4;>(NmtRH1`tzKWI+uU+Fk^n~u>) zM-zYs>;lADq&zbUhZ1=SG`^Lh7-h{tKb)Isd1t6S$Gn&cRSs5T+_6N3HFa{v$ksY= zWV1jd3jR9p=A*jeo_Jw?%5~5AarDLFiCZGm*$nemoWg1)&ElSV-koIbD!==t!C+%D z02FTw`>N{x>-A|C_o}8OB`<$NMl0gTqNp8xa^9AHXCbZMLWHDFSkSlfXtLFjkwAMS zzS{MoWPt5?7#R}{P1b+;UMvs-9{dph9oi6(P1u^E2_%^1t^U()dpr#bp>H*KfT$7^ za9+GYoYT2>-fh`?LS!q`0JV)1m`3^k{?ThvR%w;(H!7xKMQ{O&ImnPaKe`JeIn`&S}nI; zlSIjmWFDjd4bf-UR}sP0z`-06KBrjmg8!W32}s0WR9Xdc2O5C&chdm?>+hB_%#Q!r zx&CcCPr!x!^ZL2ijYi^Ii26gdB)YvClK;{bn~|0f6&wlm9hDyUU0ZtsbD#63=YmaL z9LUBO5OFZWL!97VFc19S1k# z-!FCoA4~-#r#|;ECw566*AmSfTG#j9&vQ0Jr!H1a$@=zpi?7O zpmL(3=j^EWBKp__&(z}u0CZ;z64>Ta*`7D1)gR-{M3byaF<~Wei%=8!&We#P)ASLd zuJ+h}_*S(orngWr{l!JpjuVvQ{d#OtNd^|tGT0j7R&`8=8FXFIUGDLlXBkZ>y1W@C zg+#f~B=e+>oGep9xPEjH(Or_+8ND%^<=N&Jc;Z;d3G>*gzIvGO4Hsl!BbiB$DFT8; z*3#sU104rFH?q5x3)*?hKd6H@h{d)yCM65IeY6!d4h#b=ogtlHJK>1-g}_pwFNUj% zmxR_TzZdwg9I*d;ABO~fh<``-&wZRSgbx7g?-r@Q9}xe~=x+&h&y%hR7`}^sg{Z5o zHcQKZzsydv5qZZC_`n}V9vuPQ$I4OF{fvH0@c|ENu|}!;?U8J=4^fYwU)a=%cFBK^ G{{IK*8=3k5 diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index b11bfb876..6daeae0cc 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -34,6 +34,13 @@ func newError(ip int, op opcode.Opcode, err interface{}) *errorAtInstruct { // StateMessage is a vm state message which could be used as additional info for example by cli. type StateMessage string +// ScriptHashGetter defines an interface for getting calling, entry and current script hashes. +type ScriptHashGetter interface { + GetCallingScriptHash() util.Uint160 + GetEntryScriptHash() util.Uint160 + GetCurrentScriptHash() util.Uint160 +} + const ( // MaxArraySize is the maximum array size allowed in the VM. MaxArraySize = 1024 @@ -1527,3 +1534,18 @@ func (v *VM) bytesToPublicKey(b []byte) *keys.PublicKey { } return pkey } + +// GetCallingScriptHash implements ScriptHashGetter interface +func (v *VM) GetCallingScriptHash() util.Uint160 { + return v.GetContextScriptHash(1) +} + +// GetEntryScriptHash implements ScriptHashGetter interface +func (v *VM) GetEntryScriptHash() util.Uint160 { + return v.GetContextScriptHash(v.Istack().Len() - 1) +} + +// GetCurrentScriptHash implements ScriptHashGetter interface +func (v *VM) GetCurrentScriptHash() util.Uint160 { + return v.GetContextScriptHash(0) +} From 5ece9922c154c1d278bbaaff96e629851ccb9d87 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Mon, 4 May 2020 11:41:41 +0300 Subject: [PATCH 5/5] vm: hide GetContextScriptHash() method After adding ScriptHashGetter interface to vm, there's no need in GetContextScriptHash() to be exported. --- pkg/core/interop_neo.go | 2 +- pkg/core/interop_system.go | 10 +++++----- pkg/core/native/contract.go | 2 +- pkg/vm/context.go | 6 +++--- pkg/vm/vm.go | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pkg/core/interop_neo.go b/pkg/core/interop_neo.go index e8dfda15d..0507764dc 100644 --- a/pkg/core/interop_neo.go +++ b/pkg/core/interop_neo.go @@ -540,7 +540,7 @@ func contractMigrate(ic *interop.Context, v *vm.VM) error { return err } if contract.HasStorage() { - hash := v.GetContextScriptHash(0) + hash := v.GetCurrentScriptHash() siMap, err := ic.DAO.GetStorageItems(hash) if err != nil { return err diff --git a/pkg/core/interop_system.go b/pkg/core/interop_system.go index 396534c8a..30f085f7c 100644 --- a/pkg/core/interop_system.go +++ b/pkg/core/interop_system.go @@ -292,7 +292,7 @@ func runtimeNotify(ic *interop.Context, v *vm.VM) error { if err != nil { item = vm.NewByteArrayItem([]byte(fmt.Sprintf("bad notification: %v", err))) } - ne := state.NotificationEvent{ScriptHash: v.GetContextScriptHash(0), Item: item} + ne := state.NotificationEvent{ScriptHash: v.GetCurrentScriptHash(), Item: item} ic.Notifications = append(ic.Notifications, ne) return nil } @@ -301,7 +301,7 @@ func runtimeNotify(ic *interop.Context, v *vm.VM) error { func runtimeLog(ic *interop.Context, v *vm.VM) error { msg := fmt.Sprintf("%q", v.Estack().Pop().Bytes()) ic.Log.Info("runtime log", - zap.Stringer("script", v.GetContextScriptHash(0)), + zap.Stringer("script", v.GetCurrentScriptHash()), zap.String("logs", msg)) return nil } @@ -383,7 +383,7 @@ func storageGet(ic *interop.Context, v *vm.VM) error { // storageGetContext returns storage context (scripthash). func storageGetContext(ic *interop.Context, v *vm.VM) error { sc := &StorageContext{ - ScriptHash: v.GetContextScriptHash(0), + ScriptHash: v.GetCurrentScriptHash(), ReadOnly: false, } v.Estack().PushVal(vm.NewInteropItem(sc)) @@ -393,7 +393,7 @@ func storageGetContext(ic *interop.Context, v *vm.VM) error { // storageGetReadOnlyContext returns read-only context (scripthash). func storageGetReadOnlyContext(ic *interop.Context, v *vm.VM) error { sc := &StorageContext{ - ScriptHash: v.GetContextScriptHash(0), + ScriptHash: v.GetCurrentScriptHash(), ReadOnly: true, } v.Estack().PushVal(vm.NewInteropItem(sc)) @@ -475,7 +475,7 @@ func contractDestroy(ic *interop.Context, v *vm.VM) error { if ic.Trigger != trigger.Application { return errors.New("can't destroy contract when not triggered by application") } - hash := v.GetContextScriptHash(0) + hash := v.GetCurrentScriptHash() cs, err := ic.DAO.GetContractState(hash) if err != nil { return nil diff --git a/pkg/core/native/contract.go b/pkg/core/native/contract.go index a4b83e751..a16df5af8 100644 --- a/pkg/core/native/contract.go +++ b/pkg/core/native/contract.go @@ -69,7 +69,7 @@ func (cs *Contracts) GetNativeInterop(ic *interop.Context) func(uint32) *vm.Inte // getNativeInterop returns native contract interop. func getNativeInterop(ic *interop.Context, c interop.Contract) func(v *vm.VM) error { return func(v *vm.VM) error { - h := v.GetContextScriptHash(0) + h := v.GetCurrentScriptHash() if !h.Equals(c.Metadata().Hash) { return errors.New("invalid hash") } diff --git a/pkg/vm/context.go b/pkg/vm/context.go index 14b039dfd..3a799b13c 100644 --- a/pkg/vm/context.go +++ b/pkg/vm/context.go @@ -223,9 +223,9 @@ func (c *Context) String() string { return "execution context" } -// GetContextScriptHash returns script hash of the invocation stack element +// getContextScriptHash returns script hash of the invocation stack element // number n. -func (v *VM) GetContextScriptHash(n int) util.Uint160 { +func (v *VM) getContextScriptHash(n int) util.Uint160 { element := v.Istack().Peek(n) if element == nil { return util.Uint160{} @@ -238,7 +238,7 @@ func (v *VM) GetContextScriptHash(n int) util.Uint160 { // PushContextScriptHash pushes to evaluation stack the script hash of the // invocation stack element number n. func (v *VM) PushContextScriptHash(n int) error { - h := v.GetContextScriptHash(n) + h := v.getContextScriptHash(n) v.Estack().PushVal(h.BytesBE()) return nil } diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index 6daeae0cc..573d28159 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -1537,15 +1537,15 @@ func (v *VM) bytesToPublicKey(b []byte) *keys.PublicKey { // GetCallingScriptHash implements ScriptHashGetter interface func (v *VM) GetCallingScriptHash() util.Uint160 { - return v.GetContextScriptHash(1) + return v.getContextScriptHash(1) } // GetEntryScriptHash implements ScriptHashGetter interface func (v *VM) GetEntryScriptHash() util.Uint160 { - return v.GetContextScriptHash(v.Istack().Len() - 1) + return v.getContextScriptHash(v.Istack().Len() - 1) } // GetCurrentScriptHash implements ScriptHashGetter interface func (v *VM) GetCurrentScriptHash() util.Uint160 { - return v.GetContextScriptHash(0) + return v.getContextScriptHash(0) }