@btc-vision/btc-runtime 1.3.5 → 1.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@btc-vision/btc-runtime",
3
- "version": "1.3.5",
3
+ "version": "1.3.6",
4
4
  "description": "Bitcoin Smart Contract Runtime",
5
5
  "main": "btc/index.ts",
6
6
  "scripts": {
@@ -16,6 +16,7 @@ import {
16
16
  encodeAddress,
17
17
  loadPointer,
18
18
  log,
19
+ nextPointerGreaterThan,
19
20
  storePointer,
20
21
  validateBitcoinAddress,
21
22
  } from './global';
@@ -231,6 +232,22 @@ export class BlockchainEnvironment {
231
232
  return defaultValue;
232
233
  }
233
234
 
235
+ public getNextPointerGreaterThan(
236
+ targetPointer: MemorySlotPointer,
237
+ valueAtLeast: u256,
238
+ lte: boolean = true,
239
+ ): MemorySlotData<u256> {
240
+ const writer = new BytesWriter(65);
241
+ writer.writeU256(targetPointer);
242
+ writer.writeU256(valueAtLeast);
243
+ writer.writeBoolean(lte);
244
+
245
+ const result: Uint8Array = nextPointerGreaterThan(writer.getBuffer());
246
+ const reader: BytesReader = new BytesReader(result);
247
+
248
+ return reader.readU256();
249
+ }
250
+
234
251
  public hasStorageAt(pointerHash: MemorySlotPointer): bool {
235
252
  // We mark zero as the default value for the storage, if something is 0, the storage slot get deleted or is non-existent
236
253
  const val: u256 = this.getStorageAt(pointerHash, u256.Zero);
@@ -2,6 +2,10 @@
2
2
  @external('env', 'load')
3
3
  export declare function loadPointer(data: Uint8Array): Uint8Array;
4
4
 
5
+ // @ts-ignore
6
+ @external('env', 'nextPointerGreaterThan')
7
+ export declare function nextPointerGreaterThan(data: Uint8Array): Uint8Array;
8
+
5
9
  // @ts-ignore
6
10
  @external('env', 'store')
7
11
  export declare function storePointer(data: Uint8Array): Uint8Array;
@@ -12,8 +12,17 @@ export function encodeSelector(name: string): Selector {
12
12
  return bytes4(hash);
13
13
  }
14
14
 
15
- export function encodePointer(typed: Uint8Array): MemorySlotPointer {
15
+ export function encodePointer(uniqueIdentifier: u16, typed: Uint8Array): MemorySlotPointer {
16
16
  const hash = Sha256.hash(typed);
17
17
 
18
- return bytes32(hash);
18
+ const finalPointer = new Uint8Array(32);
19
+ finalPointer[0] = uniqueIdentifier & 0xff;
20
+ finalPointer[1] = (uniqueIdentifier >> 8) & 0xff;
21
+
22
+ for (let i = 0; i < 30; i++) {
23
+ // drop the last two bytes
24
+ finalPointer[i + 2] = hash[i];
25
+ }
26
+
27
+ return bytes32(finalPointer);
19
28
  }
@@ -49,10 +49,9 @@ export class AddressMemoryMap<V extends MemorySlotData<u256>> {
49
49
  }
50
50
 
51
51
  private encodePointer(key: Address): MemorySlotPointer {
52
- const writer = new BytesWriter(key.length + 2);
53
- writer.writeU16(this.pointer);
52
+ const writer = new BytesWriter(key.length);
54
53
  writer.writeBytes(key);
55
54
 
56
- return encodePointer(writer.getBuffer());
55
+ return encodePointer(this.pointer, writer.getBuffer());
57
56
  }
58
57
  }
@@ -53,10 +53,9 @@ export class KeyMerger<K extends string, K2 extends string, V extends MemorySlot
53
53
  }
54
54
 
55
55
  private encodePointer(key: string): MemorySlotPointer {
56
- const writer = new BytesWriter(key.length + 2);
57
- writer.writeU16(this.pointer);
56
+ const writer = new BytesWriter(key.length);
58
57
  writer.writeString(key);
59
58
 
60
- return encodePointer(writer.getBuffer());
59
+ return encodePointer(this.pointer, writer.getBuffer());
61
60
  }
62
61
  }
@@ -48,10 +48,9 @@ export class StringMemoryMap<K extends string, V extends MemorySlotData<u256>> {
48
48
  }
49
49
 
50
50
  private encodePointer(key: K): MemorySlotPointer {
51
- const writer = new BytesWriter(key.length + 2);
52
- writer.writeU16(this.pointer);
51
+ const writer = new BytesWriter(key.length);
53
52
  writer.writeString(key);
54
53
 
55
- return encodePointer(writer.getBuffer());
54
+ return encodePointer(this.pointer, writer.getBuffer());
56
55
  }
57
56
  }
@@ -51,7 +51,7 @@ export class Uint8ArrayMerger<V extends MemorySlotData<u256>> {
51
51
  }
52
52
 
53
53
  private getKeyHash(key: Uint8Array): MemorySlotPointer {
54
- const writer: BytesWriter = new BytesWriter(key.byteLength + 2 + this.parentKey.byteLength);
54
+ const writer: BytesWriter = new BytesWriter(key.byteLength + this.parentKey.byteLength);
55
55
 
56
56
  writer.writeBytes(this.parentKey);
57
57
  writer.writeBytes(key);
@@ -60,8 +60,6 @@ export class Uint8ArrayMerger<V extends MemorySlotData<u256>> {
60
60
  }
61
61
 
62
62
  private encodePointer(writer: BytesWriter): MemorySlotPointer {
63
- writer.writeU16(this.pointer);
64
-
65
- return encodePointer(writer.getBuffer());
63
+ return encodePointer(this.pointer, writer.getBuffer());
66
64
  }
67
65
  }
@@ -80,10 +80,9 @@ export abstract class Serializable {
80
80
  }
81
81
 
82
82
  private getPointer(subPointer: u256): u256 {
83
- const writer = new BytesWriter(34);
84
- writer.writeU16(this.pointer);
83
+ const writer = new BytesWriter(32);
85
84
  writer.writeU256(subPointer);
86
85
 
87
- return encodePointer(writer.getBuffer());
86
+ return encodePointer(this.pointer, writer.getBuffer());
88
87
  }
89
88
  }
@@ -14,10 +14,9 @@ export class StoredAddress {
14
14
  defaultValue: Address,
15
15
  ) {
16
16
  const writer = new BytesWriter(32);
17
- writer.writeU16(pointer);
18
17
 
19
18
  this.defaultValue = u256.fromBytes(defaultValue);
20
- this.addressPointer = encodePointer(writer.getBuffer());
19
+ this.addressPointer = encodePointer(pointer, writer.getBuffer());
21
20
  }
22
21
 
23
22
  private _value: Address = new Address();
@@ -33,11 +33,10 @@ export class StoredString {
33
33
  }
34
34
 
35
35
  private getPointer(key: u256): u256 {
36
- const buf = new BytesWriter(34);
37
- buf.writeU16(this.pointer);
36
+ const buf = new BytesWriter(32);
38
37
  buf.writeU256(key);
39
38
 
40
- return encodePointer(buf.getBuffer());
39
+ return encodePointer(this.pointer, buf.getBuffer());
41
40
  }
42
41
 
43
42
  private save(): void {
@@ -14,11 +14,10 @@ export class StoredU256 {
14
14
  public subPointer: MemorySlotPointer,
15
15
  private defaultValue: u256,
16
16
  ) {
17
- const writer = new BytesWriter(34);
18
- writer.writeU16(pointer);
17
+ const writer = new BytesWriter(32);
19
18
  writer.writeU256(subPointer);
20
19
 
21
- this.u256Pointer = encodePointer(writer.getBuffer());
20
+ this.u256Pointer = encodePointer(pointer, writer.getBuffer());
22
21
  }
23
22
 
24
23
  private _value: u256 = u256.Zero;