@coinbase/cdp-hooks 0.0.71 → 0.0.73

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/README.md CHANGED
@@ -1759,6 +1759,43 @@ function SendUserOperation() {
1759
1759
  }
1760
1760
  ```
1761
1761
 
1762
+ **Transaction Attribution with EIP-8021:**
1763
+
1764
+ You can add attribution data to user operations for tracking app usage and revenue sharing:
1765
+
1766
+ ```tsx lines
1767
+ import { useSendUserOperation, useCurrentUser } from "@coinbase/cdp-hooks";
1768
+
1769
+ function SendUserOperationWithAttribution() {
1770
+ const { sendUserOperation, status } = useSendUserOperation();
1771
+ const { currentUser } = useCurrentUser();
1772
+
1773
+ // EIP-8021 data suffix for "baseapp" attribution
1774
+ const dataSuffix = "0xdddddddd62617365617070070080218021802180218021802180218021";
1775
+
1776
+ const handleSendWithAttribution = async () => {
1777
+ const smartAccount = currentUser?.evmSmartAccountObjects?.[0]?.address;
1778
+ if (!smartAccount) return;
1779
+
1780
+ await sendUserOperation({
1781
+ evmSmartAccount: smartAccount,
1782
+ network: "base-sepolia",
1783
+ calls: [{ to: "0xTargetContract", value: 0n, data: "0x" }],
1784
+ dataSuffix, // Attribution data appended to callData
1785
+ useCdpPaymaster: true,
1786
+ });
1787
+ };
1788
+
1789
+ return (
1790
+ <button onClick={handleSendWithAttribution} disabled={status === "pending"}>
1791
+ Send with Attribution
1792
+ </button>
1793
+ );
1794
+ }
1795
+ ```
1796
+
1797
+ The `dataSuffix` parameter accepts a hex-encoded string following the [EIP-8021 standard](https://eip.tools/eip/8021). This enables onchain attribution for tracking and revenue sharing.
1798
+
1762
1799
  #### Track User Operation Status
1763
1800
 
1764
1801
  Use the `useWaitForUserOperation` hook to poll for user operation status and provide real-time updates. This hook immediately fires off a query to get the result of the user operation:
@@ -1,5 +1,5 @@
1
- import { fromNumber as a } from "./index274.js";
2
- import { toRpc as e } from "./index275.js";
1
+ import { fromNumber as a } from "./index275.js";
2
+ import { toRpc as e } from "./index276.js";
3
3
  function n(t) {
4
4
  return {
5
5
  ...typeof t.baseFeePerGas == "bigint" && {
@@ -1,5 +1,5 @@
1
1
  import { recoverAddress as i } from "./index171.js";
2
- import { hashAuthorization as e } from "./index276.js";
2
+ import { hashAuthorization as e } from "./index274.js";
3
3
  async function a(o) {
4
4
  const { authorization: r, signature: t } = o;
5
5
  return i({
@@ -1,6 +1,6 @@
1
1
  import { from as t } from "./index277.js";
2
2
  import { encode as m } from "./index278.js";
3
- import { concat as c } from "./index274.js";
3
+ import { concat as c } from "./index275.js";
4
4
  function s(o, e) {
5
5
  const { bytecode: r, args: n } = e;
6
6
  return c(r, o.inputs?.length && n?.length ? m(o.inputs, n) : "0x");
@@ -1,6 +1,6 @@
1
1
  import { from as c, fromAbi as m, NotFoundError as i, getSelector as s } from "./index277.js";
2
2
  import { encode as u } from "./index278.js";
3
- import { concat as d } from "./index274.js";
3
+ import { concat as d } from "./index275.js";
4
4
  function S(o, ...t) {
5
5
  const { overloads: r } = o, e = r ? p([o, ...r], o.name, {
6
6
  args: t[0]
@@ -1,158 +1,19 @@
1
- import { BaseError as o } from "./index286.js";
2
- import { stringify as b } from "./index287.js";
3
- import { pad as d, assertEndOffset as m, assertSize as g, assertStartOffset as p } from "./index288.js";
4
- const $ = /* @__PURE__ */ new TextEncoder(), h = /* @__PURE__ */ Array.from({ length: 256 }, (t, e) => e.toString(16).padStart(2, "0"));
5
- function y(t, e = {}) {
6
- const { strict: r = !1 } = e;
7
- if (!t)
8
- throw new f(t);
9
- if (typeof t != "string")
10
- throw new f(t);
11
- if (r && !/^0x[0-9a-fA-F]*$/.test(t))
12
- throw new l(t);
13
- if (!t.startsWith("0x"))
14
- throw new l(t);
15
- }
16
- function B(...t) {
17
- return `0x${t.reduce((e, r) => e + r.replace("0x", ""), "")}`;
18
- }
19
- function P(t, e = {}) {
20
- const r = `0x${Number(t)}`;
21
- return typeof e.size == "number" ? (g(r, e.size), x(r, e.size)) : r;
22
- }
23
- function w(t, e = {}) {
24
- let r = "";
25
- for (let i = 0; i < t.length; i++)
26
- r += h[t[i]];
27
- const n = `0x${r}`;
28
- return typeof e.size == "number" ? (g(n, e.size), E(n, e.size)) : n;
29
- }
30
- function V(t, e = {}) {
31
- const { signed: r, size: n } = e, i = BigInt(t);
32
- let s;
33
- n ? r ? s = (1n << BigInt(n) * 8n - 1n) - 1n : s = 2n ** (BigInt(n) * 8n) - 1n : typeof t == "number" && (s = BigInt(Number.MAX_SAFE_INTEGER));
34
- const u = typeof s == "bigint" && r ? -s - 1n : 0;
35
- if (s && i > s || i < u) {
36
- const a = typeof t == "bigint" ? "n" : "";
37
- throw new O({
38
- max: s ? `${s}${a}` : void 0,
39
- min: `${u}${a}`,
40
- signed: r,
41
- size: n,
42
- value: `${t}${a}`
43
- });
44
- }
45
- const c = `0x${(r && i < 0 ? (1n << BigInt(n * 8)) + BigInt(i) : i).toString(16)}`;
46
- return n ? x(c, n) : c;
47
- }
48
- function j(t, e = {}) {
49
- return w($.encode(t), e);
50
- }
51
- function x(t, e) {
52
- return d(t, { dir: "left", size: e });
53
- }
54
- function E(t, e) {
55
- return d(t, { dir: "right", size: e });
56
- }
57
- function v(t, e, r, n = {}) {
58
- const { strict: i } = n;
59
- p(t, e);
60
- const s = `0x${t.replace("0x", "").slice((e ?? 0) * 2, (r ?? t.length) * 2)}`;
61
- return i && m(s, e, r), s;
62
- }
63
- function A(t) {
64
- return Math.ceil((t.length - 2) / 2);
65
- }
66
- function N(t, e = {}) {
67
- const { strict: r = !1 } = e;
68
- try {
69
- return y(t, { strict: r }), !0;
70
- } catch {
71
- return !1;
72
- }
73
- }
74
- class O extends o {
75
- constructor({ max: e, min: r, signed: n, size: i, value: s }) {
76
- super(`Number \`${s}\` is not in safe${i ? ` ${i * 8}-bit` : ""}${n ? " signed" : " unsigned"} integer range ${e ? `(\`${r}\` to \`${e}\`)` : `(above \`${r}\`)`}`), Object.defineProperty(this, "name", {
77
- enumerable: !0,
78
- configurable: !0,
79
- writable: !0,
80
- value: "Hex.IntegerOutOfRangeError"
81
- });
82
- }
83
- }
84
- class f extends o {
85
- constructor(e) {
86
- super(`Value \`${typeof e == "object" ? b(e) : e}\` of type \`${typeof e}\` is an invalid hex type.`, {
87
- metaMessages: ['Hex types must be represented as `"0x${string}"`.']
88
- }), Object.defineProperty(this, "name", {
89
- enumerable: !0,
90
- configurable: !0,
91
- writable: !0,
92
- value: "Hex.InvalidHexTypeError"
93
- });
94
- }
95
- }
96
- class l extends o {
97
- constructor(e) {
98
- super(`Value \`${e}\` is an invalid hex value.`, {
99
- metaMessages: [
100
- 'Hex values must start with `"0x"` and contain only hexadecimal characters (0-9, a-f, A-F).'
101
- ]
102
- }), Object.defineProperty(this, "name", {
103
- enumerable: !0,
104
- configurable: !0,
105
- writable: !0,
106
- value: "Hex.InvalidHexValueError"
107
- });
108
- }
109
- }
110
- class _ extends o {
111
- constructor({ givenSize: e, maxSize: r }) {
112
- super(`Size cannot exceed \`${r}\` bytes. Given size: \`${e}\` bytes.`), Object.defineProperty(this, "name", {
113
- enumerable: !0,
114
- configurable: !0,
115
- writable: !0,
116
- value: "Hex.SizeOverflowError"
117
- });
118
- }
119
- }
120
- class M extends o {
121
- constructor({ offset: e, position: r, size: n }) {
122
- super(`Slice ${r === "start" ? "starting" : "ending"} at offset \`${e}\` is out-of-bounds (size: \`${n}\`).`), Object.defineProperty(this, "name", {
123
- enumerable: !0,
124
- configurable: !0,
125
- writable: !0,
126
- value: "Hex.SliceOffsetOutOfBoundsError"
127
- });
128
- }
129
- }
130
- class R extends o {
131
- constructor({ size: e, targetSize: r, type: n }) {
132
- super(`${n.charAt(0).toUpperCase()}${n.slice(1).toLowerCase()} size (\`${e}\`) exceeds padding size (\`${r}\`).`), Object.defineProperty(this, "name", {
133
- enumerable: !0,
134
- configurable: !0,
135
- writable: !0,
136
- value: "Hex.SizeExceedsPaddingSizeError"
137
- });
138
- }
1
+ import { concatHex as i } from "./index135.js";
2
+ import { hexToBytes as m } from "./index130.js";
3
+ import { numberToHex as c } from "./index131.js";
4
+ import { toRlp as d } from "./index176.js";
5
+ import { keccak256 as f } from "./index132.js";
6
+ function b(o) {
7
+ const { chainId: t, nonce: r, to: s } = o, e = o.contractAddress ?? o.address, n = f(i([
8
+ "0x05",
9
+ d([
10
+ t ? c(t) : "0x",
11
+ e,
12
+ r ? c(r) : "0x"
13
+ ])
14
+ ]));
15
+ return s === "bytes" ? m(n) : n;
139
16
  }
140
17
  export {
141
- O as IntegerOutOfRangeError,
142
- f as InvalidHexTypeError,
143
- l as InvalidHexValueError,
144
- R as SizeExceedsPaddingSizeError,
145
- _ as SizeOverflowError,
146
- M as SliceOffsetOutOfBoundsError,
147
- y as assert,
148
- B as concat,
149
- P as fromBoolean,
150
- w as fromBytes,
151
- V as fromNumber,
152
- j as fromString,
153
- x as padLeft,
154
- E as padRight,
155
- A as size,
156
- v as slice,
157
- N as validate
18
+ b as hashAuthorization
158
19
  };
@@ -1,12 +1,158 @@
1
- import { fromNumber as e } from "./index274.js";
2
- function r(o) {
3
- return {
4
- address: o.address,
5
- amount: e(o.amount),
6
- index: e(o.index),
7
- validatorIndex: e(o.validatorIndex)
8
- };
1
+ import { BaseError as o } from "./index286.js";
2
+ import { stringify as b } from "./index287.js";
3
+ import { pad as d, assertEndOffset as m, assertSize as g, assertStartOffset as p } from "./index288.js";
4
+ const $ = /* @__PURE__ */ new TextEncoder(), h = /* @__PURE__ */ Array.from({ length: 256 }, (t, e) => e.toString(16).padStart(2, "0"));
5
+ function y(t, e = {}) {
6
+ const { strict: r = !1 } = e;
7
+ if (!t)
8
+ throw new f(t);
9
+ if (typeof t != "string")
10
+ throw new f(t);
11
+ if (r && !/^0x[0-9a-fA-F]*$/.test(t))
12
+ throw new l(t);
13
+ if (!t.startsWith("0x"))
14
+ throw new l(t);
15
+ }
16
+ function B(...t) {
17
+ return `0x${t.reduce((e, r) => e + r.replace("0x", ""), "")}`;
18
+ }
19
+ function P(t, e = {}) {
20
+ const r = `0x${Number(t)}`;
21
+ return typeof e.size == "number" ? (g(r, e.size), x(r, e.size)) : r;
22
+ }
23
+ function w(t, e = {}) {
24
+ let r = "";
25
+ for (let i = 0; i < t.length; i++)
26
+ r += h[t[i]];
27
+ const n = `0x${r}`;
28
+ return typeof e.size == "number" ? (g(n, e.size), E(n, e.size)) : n;
29
+ }
30
+ function V(t, e = {}) {
31
+ const { signed: r, size: n } = e, i = BigInt(t);
32
+ let s;
33
+ n ? r ? s = (1n << BigInt(n) * 8n - 1n) - 1n : s = 2n ** (BigInt(n) * 8n) - 1n : typeof t == "number" && (s = BigInt(Number.MAX_SAFE_INTEGER));
34
+ const u = typeof s == "bigint" && r ? -s - 1n : 0;
35
+ if (s && i > s || i < u) {
36
+ const a = typeof t == "bigint" ? "n" : "";
37
+ throw new O({
38
+ max: s ? `${s}${a}` : void 0,
39
+ min: `${u}${a}`,
40
+ signed: r,
41
+ size: n,
42
+ value: `${t}${a}`
43
+ });
44
+ }
45
+ const c = `0x${(r && i < 0 ? (1n << BigInt(n * 8)) + BigInt(i) : i).toString(16)}`;
46
+ return n ? x(c, n) : c;
47
+ }
48
+ function j(t, e = {}) {
49
+ return w($.encode(t), e);
50
+ }
51
+ function x(t, e) {
52
+ return d(t, { dir: "left", size: e });
53
+ }
54
+ function E(t, e) {
55
+ return d(t, { dir: "right", size: e });
56
+ }
57
+ function v(t, e, r, n = {}) {
58
+ const { strict: i } = n;
59
+ p(t, e);
60
+ const s = `0x${t.replace("0x", "").slice((e ?? 0) * 2, (r ?? t.length) * 2)}`;
61
+ return i && m(s, e, r), s;
62
+ }
63
+ function A(t) {
64
+ return Math.ceil((t.length - 2) / 2);
65
+ }
66
+ function N(t, e = {}) {
67
+ const { strict: r = !1 } = e;
68
+ try {
69
+ return y(t, { strict: r }), !0;
70
+ } catch {
71
+ return !1;
72
+ }
73
+ }
74
+ class O extends o {
75
+ constructor({ max: e, min: r, signed: n, size: i, value: s }) {
76
+ super(`Number \`${s}\` is not in safe${i ? ` ${i * 8}-bit` : ""}${n ? " signed" : " unsigned"} integer range ${e ? `(\`${r}\` to \`${e}\`)` : `(above \`${r}\`)`}`), Object.defineProperty(this, "name", {
77
+ enumerable: !0,
78
+ configurable: !0,
79
+ writable: !0,
80
+ value: "Hex.IntegerOutOfRangeError"
81
+ });
82
+ }
83
+ }
84
+ class f extends o {
85
+ constructor(e) {
86
+ super(`Value \`${typeof e == "object" ? b(e) : e}\` of type \`${typeof e}\` is an invalid hex type.`, {
87
+ metaMessages: ['Hex types must be represented as `"0x${string}"`.']
88
+ }), Object.defineProperty(this, "name", {
89
+ enumerable: !0,
90
+ configurable: !0,
91
+ writable: !0,
92
+ value: "Hex.InvalidHexTypeError"
93
+ });
94
+ }
95
+ }
96
+ class l extends o {
97
+ constructor(e) {
98
+ super(`Value \`${e}\` is an invalid hex value.`, {
99
+ metaMessages: [
100
+ 'Hex values must start with `"0x"` and contain only hexadecimal characters (0-9, a-f, A-F).'
101
+ ]
102
+ }), Object.defineProperty(this, "name", {
103
+ enumerable: !0,
104
+ configurable: !0,
105
+ writable: !0,
106
+ value: "Hex.InvalidHexValueError"
107
+ });
108
+ }
109
+ }
110
+ class _ extends o {
111
+ constructor({ givenSize: e, maxSize: r }) {
112
+ super(`Size cannot exceed \`${r}\` bytes. Given size: \`${e}\` bytes.`), Object.defineProperty(this, "name", {
113
+ enumerable: !0,
114
+ configurable: !0,
115
+ writable: !0,
116
+ value: "Hex.SizeOverflowError"
117
+ });
118
+ }
119
+ }
120
+ class M extends o {
121
+ constructor({ offset: e, position: r, size: n }) {
122
+ super(`Slice ${r === "start" ? "starting" : "ending"} at offset \`${e}\` is out-of-bounds (size: \`${n}\`).`), Object.defineProperty(this, "name", {
123
+ enumerable: !0,
124
+ configurable: !0,
125
+ writable: !0,
126
+ value: "Hex.SliceOffsetOutOfBoundsError"
127
+ });
128
+ }
129
+ }
130
+ class R extends o {
131
+ constructor({ size: e, targetSize: r, type: n }) {
132
+ super(`${n.charAt(0).toUpperCase()}${n.slice(1).toLowerCase()} size (\`${e}\`) exceeds padding size (\`${r}\`).`), Object.defineProperty(this, "name", {
133
+ enumerable: !0,
134
+ configurable: !0,
135
+ writable: !0,
136
+ value: "Hex.SizeExceedsPaddingSizeError"
137
+ });
138
+ }
9
139
  }
10
140
  export {
11
- r as toRpc
141
+ O as IntegerOutOfRangeError,
142
+ f as InvalidHexTypeError,
143
+ l as InvalidHexValueError,
144
+ R as SizeExceedsPaddingSizeError,
145
+ _ as SizeOverflowError,
146
+ M as SliceOffsetOutOfBoundsError,
147
+ y as assert,
148
+ B as concat,
149
+ P as fromBoolean,
150
+ w as fromBytes,
151
+ V as fromNumber,
152
+ j as fromString,
153
+ x as padLeft,
154
+ E as padRight,
155
+ A as size,
156
+ v as slice,
157
+ N as validate
12
158
  };
@@ -1,19 +1,12 @@
1
- import { concatHex as i } from "./index135.js";
2
- import { hexToBytes as m } from "./index130.js";
3
- import { numberToHex as c } from "./index131.js";
4
- import { toRlp as d } from "./index176.js";
5
- import { keccak256 as f } from "./index132.js";
6
- function b(o) {
7
- const { chainId: t, nonce: r, to: s } = o, e = o.contractAddress ?? o.address, n = f(i([
8
- "0x05",
9
- d([
10
- t ? c(t) : "0x",
11
- e,
12
- r ? c(r) : "0x"
13
- ])
14
- ]));
15
- return s === "bytes" ? m(n) : n;
1
+ import { fromNumber as e } from "./index275.js";
2
+ function r(o) {
3
+ return {
4
+ address: o.address,
5
+ amount: e(o.amount),
6
+ index: e(o.index),
7
+ validatorIndex: e(o.validatorIndex)
8
+ };
16
9
  }
17
10
  export {
18
- b as hashAuthorization
11
+ r as toRpc
19
12
  };
@@ -1,6 +1,6 @@
1
1
  import { BaseError as y } from "./index286.js";
2
2
  import { keccak256 as v } from "./index289.js";
3
- import { validate as $, slice as A, fromString as S } from "./index274.js";
3
+ import { validate as $, slice as A, fromString as S } from "./index275.js";
4
4
  import { isArgOfType as E, normalizeSignature as p, getAmbiguousTypes as B } from "./index290.js";
5
5
  import { parseAbiItem as l } from "./index227.js";
6
6
  import { formatAbiItem as h } from "./index219.js";
@@ -1,6 +1,6 @@
1
1
  import { assert as p } from "./index291.js";
2
2
  import { BaseError as u } from "./index286.js";
3
- import { size as y, padLeft as f, fromString as x, fromBoolean as w, fromNumber as E, padRight as P, concat as g } from "./index274.js";
3
+ import { size as y, padLeft as f, fromString as x, fromBoolean as w, fromNumber as E, padRight as P, concat as g } from "./index275.js";
4
4
  import { integerRegex as A, bytesRegex as $, arrayRegex as L } from "./index292.js";
5
5
  import { prepareParameters as z, encode as I } from "./index293.js";
6
6
  function N(n, e, t) {
@@ -1,4 +1,4 @@
1
- import { SizeExceedsPaddingSizeError as s, size as i, SliceOffsetOutOfBoundsError as f, SizeOverflowError as p } from "./index274.js";
1
+ import { SizeExceedsPaddingSizeError as s, size as i, SliceOffsetOutOfBoundsError as f, SizeOverflowError as p } from "./index275.js";
2
2
  function c(t, e) {
3
3
  if (i(t) > e)
4
4
  throw new p({
@@ -1,6 +1,6 @@
1
1
  import { keccak_256 as f } from "./index206.js";
2
2
  import { from as m } from "./index294.js";
3
- import { fromBytes as s } from "./index274.js";
3
+ import { fromBytes as s } from "./index275.js";
4
4
  function p(t, o = {}) {
5
5
  const { as: e = typeof t == "string" ? "Hex" : "Bytes" } = o, r = f(m(t));
6
6
  return e === "Bytes" ? r : s(r);
@@ -1,7 +1,7 @@
1
1
  import { InvalidTypeError as g, InvalidArrayError as b, ArrayLengthMismatchError as w, BytesSizeMismatchError as z } from "./index278.js";
2
2
  import { assert as x } from "./index291.js";
3
3
  import { BaseError as S } from "./index286.js";
4
- import { size as d, fromNumber as f, concat as p, padLeft as h, fromBoolean as A, IntegerOutOfRangeError as E, padRight as y, fromString as I, slice as B } from "./index274.js";
4
+ import { size as d, fromNumber as f, concat as p, padLeft as h, fromBoolean as A, IntegerOutOfRangeError as E, padRight as y, fromString as I, slice as B } from "./index275.js";
5
5
  import { integerRegex as L } from "./index292.js";
6
6
  function q({ checksumAddress: e, parameters: n, values: r }) {
7
7
  const t = [];
@@ -1,5 +1,5 @@
1
1
  import { BaseError as c } from "./index286.js";
2
- import { padRight as h } from "./index274.js";
2
+ import { padRight as h } from "./index275.js";
3
3
  import { charCodeToBase16 as b, assertSize as g, pad as m } from "./index295.js";
4
4
  import { assertSize as p } from "./index288.js";
5
5
  const l = /* @__PURE__ */ new TextEncoder();
@@ -1,4 +1,4 @@
1
- const o = "0.0.71";
1
+ const o = "0.0.73";
2
2
  export {
3
3
  o as VERSION
4
4
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cdp-hooks",
3
- "version": "0.0.71",
3
+ "version": "0.0.73",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**",
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "peerDependencies": {
17
17
  "react": ">=18.2.0",
18
- "@coinbase/cdp-core": "^0.0.71"
18
+ "@coinbase/cdp-core": "^0.0.73"
19
19
  },
20
20
  "devDependencies": {
21
21
  "@testing-library/jest-dom": "^6.6.3",
@@ -30,7 +30,7 @@
30
30
  "@size-limit/webpack": "^11.2.0",
31
31
  "@size-limit/webpack-why": "^11.2.0",
32
32
  "size-limit": "^11.2.0",
33
- "@coinbase/cdp-core": "^0.0.71"
33
+ "@coinbase/cdp-core": "^0.0.73"
34
34
  },
35
35
  "size-limit": [
36
36
  {